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

nsb*_*sbm 3 python forms django 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 
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:default:Noneinital:None表单中的模型和/或设置中以及在表单实例的视图中进行设置.
这些都不是成功的.我目前正在使用CharField而不是NullBooleanField.
但有没有办法得到这个结果NullBooleanField???

小智 8

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

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

我看着Django的代码,发现确实而正常NullBooleanField选择做图None,True,False1,2,3分别RadioSelect映射1True,0False和任何其他价值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'
)
Run Code Online (Sandbox Code Playgroud)


emy*_*ler 5

出于某种奇怪的原因 - 我没有在 Django 代码中检查它 - 一旦您为 NullBooleanField 提供自定义小部件,它就不再接受您期望的值 ( None,TrueFalse) 。

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

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

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'
Run Code Online (Sandbox Code Playgroud)

它看起来不太好,除非非常必要,否则我不会使用它。但它就在那里,以防万一。