我有一個CharField
Django ModelForm與一組choices
。我想爲用戶提供四個輸入:我希望三個選項具有選項選項,最後是一個自由文本輸入字段。有沒有辦法讓一個ModelForm
與一個字段有兩種不同的輸入風格?如何渲染一個Django ModelForm CharField作爲選擇框和文本框?
0
A
回答
1
我想你正在修改模型窗體中使用的小部件。這是很好的文件here。不過,這裏有一個快速示例,應該是您要查找的內容。
class ExampleForm(forms.ModelForm):
field_1 = forms.CharField(widget=forms.SelectMultiple(choices=FIELD_1_CHOICES))
field_2 = forms.CharField(widget=forms.SelectMultiple(choices=FIELD_2_CHOICES))
field_3 = forms.CharField(widget=forms.SelectMultiple(choices=FIELD_3_CHOICES))
field_4 = forms.CharField(widget=forms.TextInput())
class Meta:
model = ExampleModel
fields = ['field_1', 'field_2', 'field_3', 'field_4']
您需要爲每個字段定義FIELD_1_CHOICES,併爲您提供任何選項。此外,您不必爲field_4執行該行,因爲TextInput
是CharField
的默認小部件,但我將其添加爲明確。
1
你可以使用這個自定義小部件來解決這個問題,HTML5允許你有一個自由文本輸入和一個下拉列表,它可以作爲一個或一個其他類型的字段來工作,這就是我使它:
fields.py
from django import forms
class ListTextWidget(forms.TextInput):
def __init__(self, data_list, name, *args, **kwargs):
super(ListTextWidget, self).__init__(*args, **kwargs)
self._name = name
self._list = data_list
self.attrs.update({'list':'list__%s' % self._name})
def render(self, name, value, attrs=None):
text_html = super(ListTextWidget, self).render(name, value, attrs=attrs)
data_list = '<datalist id="list__%s">' % self._name
for item in self._list:
data_list += '<option value="%s">' % item
data_list += '</datalist>'
return (text_html + data_list)
forms.py
from myapp.fields import FormForm
class FormForm(forms.Form):
char_field_with_list = forms.CharField(required=True)
def __init__(self, *args, **kwargs):
_country_list = kwargs.pop('data_list', None)
super(FormForm, self).__init__(*args, **kwargs)
# the "name" parameter will allow you to use the same widget more than once in the same
# form, not setting this parameter differently will cuse all inputs display the
# same list.
self.fields['char_field_with_list'].widget = ListTextWidget(data_list=_data_list, name='country-list')
views.py
from myapp.forms import FormForm
def country_form(request):
# instead of hardcoding a list you could make a query of a model, as long as
# it has a __str__() method you should be able to display it.
country_list = ('Mexico', 'USA', 'China', 'France')
form = FormForm(data_list=country_list)
return render(request, 'my_app/country-form.html', {
'form': form
})
相關問題
- 1. jQuery只渲染一個選擇框
- 2. 渲染django ModelForm與jquery datepicker
- 3. 如何渲染基於ReactJS中另一個值的選擇框?
- 4. 文本框和選擇框
- 5. Django CharField,選擇和遷移
- 6. 我如何使文本框作爲Django的選擇字段
- 7. 與ModelForm和ModelFormSet(這一個不渲染)的Django WizardView
- 8. 如何在使用模型窗體集時渲染文本框而不是選擇框
- 9. 渲染到響應Django的幾個文本框
- 10. 如何將文本渲染爲一個框並用三個點替換多餘
- 11. Django的管理:CharField爲文本區域
- 12. 如何使用jQuery將所選文本和一個選擇框的值傳輸到另一個選擇框?
- 13. 複選框不會渲染
- 14. 無法渲染複選框
- 15. 將Nullable Bool渲染爲複選框
- 16. 選擇多個文本框
- 17. JQuery Mobile:如何重新渲染選擇框?
- 18. django選擇框
- 19. jQuery:選擇一個文本輸入框
- 20. 的Django的ModelForm BooleanField複選框
- 21. 如何更改選擇框後的選擇框文本?
- 22. Django - 如何顯示模型的選擇作爲複選框
- 23. 選擇框和複選框替換
- 24. 如何顯示另一個選擇框,當你從Django的另一個選擇框中選擇
- 25. 如何使用django中的複選框激活charfield?
- 26. 如何用django中的複選框替換charfield管理員
- 27. 如何從文本框中選一個文本框
- 28. 渲染一個Django單選按鈕
- 29. Java 1.6 Graphics2D:將文本渲染到一個框中
- 30. HTML選擇的選項爲文本框