我成功实施NullBooleanField
单选按钮在几个方面,但问题是,我不能设置默认值无。
下面是代码:
models.py:
class ClinicalData(models.Model):
approved = models.NullBooleanField()
...
forms.py:
NA_YES_NO = ((None, 'N/A'), (True, 'Yes'), (False, 'No'))
class ClinicalDataForm(ModelForm):
approved = forms.BooleanField(widget=forms.RadioSelect(choices=NA_YES_NO))
class Meta:
model = ClinicalData
我尝试以下方法:设置default:None
模型和/或设置inital:None
形式,并在形式实例的视图。
这些都不是全成。 即时通讯目前使用CharField
代替NullBooleanField
。
但是,有没有办法让这个结果与NullBooleanField
???
对于一些奇怪的原因-我没有在Django的代码检查- ,只要你提供一个NullBooleanField自定义窗口小部件,它不接受你所期望的值( None
, True
或False
了)。
通过分析内置的选择属性中,我发现,这些值是等于分别1
, 2
和3
。
所以,这是快速和肮脏的解决方案,我富尔德坚持用“未知”为默认单选按钮:
class ClinicalDataForm(forms.ModelForm):
class Meta:
model = ClinicalData
def __init__(self, *args, **kwargs):
super(ClinicalDataForm, self).__init__(*args, **kwargs)
approved = self.fields['approved']
approved.widget = forms.RadioSelect(
choices=approved.widget.choices)
approved.initial = '1'
它看起来并不好,我不会使用它,除非非常必要的。 但它,以防万一。
我知道这已经回答了有一段时间了,但我也试图解决这个问题和碰到这个问题就来了。
试图emyller的解决方案后,它似乎工作,但是当我看了看形式的self.cleaned_data
,我看到了,我回来的值都是要么True
或None
,没有False
记录值。
我看着Django的代码,看到的是,虽然正常NullBooleanField选择确实映射None
, True
, False
以1
, 2
, 3
分别RadioSelect映射1
至True
, 0
至False
和任何其他价值None
这是我最终使用:
my_radio_select = forms.NullBooleanField(
required=False,
widget=widgets.RadioSelect(choices=[(1, 'Yes'), (0, 'No'), (2, 'N/A')]),
initial=2, # Set initial to 'N/A'
)
对于它的价值,这里就不再给出其他答案应用在Django 1.7。 设置choices
,以[(True, "Yes"), (False, "No"), (None, "N/A")]
工作得很好。
对我来说,在Django 1.7无值默认情况下不选择(尽管克莱格声称什么)。 我子类RadioSelect,它在我的情况帮助:
from django.forms.widgets import RadioSelect
from django.utils.translation import ugettext_lazy
class NullBooleanRadioSelect(RadioSelect):
def __init__(self, *args, **kwargs):
choices = (
(None, ugettext_lazy('Unknown')),
(True, ugettext_lazy('Yes')),
(False, ugettext_lazy('No'))
)
super(NullBooleanRadioSelect, self).__init__(choices=choices, *args, **kwargs)
_empty_value = None