在文档中,nullbooleanfield
代表as a <select> box with "Unknown", "Yes" and "No" choices.
如何将select
的值更改为其他更有意义的文本,并将其映射回是,否和未知值在我的modelform
?
例如,我有yes_no_required = models.NullBooleanField()
,我希望将'yes I acknowledge this'
,'no, I do not like this'
和'I do not know now'
映射到是,否,并相应地要求。
答案 0 :(得分:30)
我花了半个小时拼凑一个演示,以证明自己的作品:
CHOICES = (
(None, "I do not know now"),
(True, "Yes I acknowledge this"),
(False, "No, I do not like this")
)
class Demo(models.Model):
yes_no_required = models.NullBooleanField(choices = CHOICES)
class DemoForm(forms.ModelForm):
class Meta:
model = Demo
我查看了Django源代码。 Everything 可以接受一个选择数组。显然,对于那些没有意义的,但它是可能的。
答案 1 :(得分:3)
您可以在表格中处理此问题(无需修改模型),如下所示:
forms.NullBooleanField(
widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace,
choices=CHOICES),
label='...',
required=False)
我认为将NullBooleanField用于可以处于三种状态的数据是一个坏主意,例如:yes / no / unset。
编辑数据有效。但是如果你想为这些数据写一个搜索表单,就会出现很大的麻烦。
然后“空”值可以有两个含义:
解决方案很简单:使用ChoiceField。
此处有更多详情:https://github.com/guettli/programming-guidelines/blob/master/README.rst
答案 2 :(得分:2)
您可以在ModelForm元类中修改字段小部件:
CHOICES = (
(None, "I do not know now"),
(True, "Yes I acknowledge this"),
(False, "No, I do not like this"),
)
class DemoForm(forms.ModelForm):
class Meta:
model = Demo
fields = ("demo_field",)
widgets = {
'demo_field': forms.RadioSelect(choices = CHOICES),
}
答案 3 :(得分:2)
简单的方法是更改表单中的窗口小部件选项:
class YourForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(YourForm, self).__init__(*args, **kwargs)
new_choices = ((1, 'I do not know now'),
(2, 'Yes I acknowledge this'),
(3, 'No, I do not like this'))
self.fields['your_field'].widget.choices = new_choices