Django:将NullBooleanField显示为Radio,默认为None

时间:2012-08-16 15:42:28

标签: python django forms form-fields

我以多种方式成功实现了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}} ???

得到这个结果

5 个答案:

答案 0 :(得分:8)

我知道这已经回答了一段时间了,但我也试图解决这个问题并遇到了这个问题。

在尝试emyller的解决方案之后,它似乎有效,但是当我查看表单的self.cleaned_data时,我看到我得到的值都是TrueNone,没有记录了False个值。

我查看了Django代码,看到正常的NullBooleanField选择确实将NoneTrueFalse映射到123分别是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)。

通过分析内置选择属性,我发现这些值分别等于False12

所以,这是一个快速而肮脏的解决方案,我可以坚持使用默认为“未知”的单选按钮:

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实现了这一目标。

您应该能够使用NoneChoiceField小部件检查RadioSelect单选选项。技巧是将None选择值设置为空字符串''

我使用的模型字段是带有BooleanField的{​​{1}},与模型字段null=True基本上相同。

NullBooleanField