Django:将NullBooleanField显示为Radio并默认为Non

2024-06-16 08:25:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我以多种方式成功地将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和/或在表单和表单实例的视图中设置{}。
所有这些都没有成功。Im当前使用的是CharField,而不是NullBooleanField
但是有什么方法可以用NullBooleanField得到这个结果吗???在


Tags: 方法nopynone表单models方式forms
3条回答

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

在尝试了emyller的解决方案后,它似乎起作用了,但是当我查看表单的self.cleaned_data时,我发现我得到的值都是True或{},没有记录False值。在

我查看了Django代码,发现虽然正常的NullBooleanField select确实将NoneTrueFalse分别映射到123,但RadioSelect将1映射到True0映射到{}和任何其他值映射到{}

我最后用的是:

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'
)

不管怎样,这里给出的其他答案不再适用于django1.7。将choices设置为[(True, "Yes"), (False, "No"), (None, "N/A")]效果很好。在

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

通过分析内置的choices属性,我发现这些值分别等于12和{}。在

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

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'

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

相关问题 更多 >