Django的:显示NullBooleanField收音机和默认为无(Django: Display

2019-07-31 01:13发布

我成功实施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 ???

Answer 1:

对于一些奇怪的原因-我没有在Django的代码检查- ,只要你提供一个NullBooleanField自定义窗口小部件,它不接受你所期望的值( NoneTrueFalse了)。

通过分析内置的选择属性中,我发现,这些值是等于分别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'

它看起来并不好,我不会使用它,除非非常必要的。 但它,以防万一。



Answer 2:

我知道这已经回答了有一段时间了,但我也试图解决这个问题和碰到这个问题就来了。

试图emyller的解决方案后,它似乎工作,但是当我看了看形式的self.cleaned_data ,我看到了,我回来的值都是要么TrueNone ,没有False记录值。

我看着Django的代码,看到的是,虽然正常NullBooleanField选择确实映射NoneTrueFalse123分别RadioSelect映射1True0False和任何其他价值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'
)


Answer 3:

对于它的价值,这里就不再给出其他答案应用在Django 1.7。 设置choices ,以[(True, "Yes"), (False, "No"), (None, "N/A")]工作得很好。



Answer 4:

对我来说,在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


文章来源: Django: Display NullBooleanField as Radio and default to None