我以多种方式成功实现了NullBooleanField
作为单选按钮,但问题是我无法将默认值设置为None。
这是代码:
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
。
但是有没有办法用{{1}} ???
答案 0 :(得分:8)
我知道这已经回答了一段时间了,但我也试图解决这个问题并遇到了这个问题。
在尝试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'
)
答案 1 :(得分:4)
由于一些奇怪的原因 - 我没有在Django代码中检查它 - 一旦你为NullBooleanField提供了一个自定义小部件,它就不接受你期望的值(None
,{{ 1}}或True
)。
通过分析内置选择属性,我发现这些值分别等于False
,1
和2
。
所以,这是一个快速而肮脏的解决方案,我可以坚持使用默认为“未知”的单选按钮:
3
它看起来不太好,除非非常必要,否则我不会使用它。但事实就是如此。
答案 2 :(得分:1)
对于它的价值,这里给出的其他答案不再适用于Django 1.7。将choices
设置为[(True, "Yes"), (False, "No"), (None, "N/A")]
即可。
答案 3 :(得分:1)
对我来说,Django 1.7默认情况下没有选择任何值(尽管Craig声称)。我将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
答案 4 :(得分:0)
我已经使用Django 2.2实现了这一目标。
您应该能够使用None
和ChoiceField
小部件检查RadioSelect
单选选项。技巧是将None
选择值设置为空字符串''
。
我使用的模型字段是带有BooleanField
的{{1}},与模型字段null=True
基本上相同。
NullBooleanField