4

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???

4

5 回答 5

8

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

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

我查看了 Django 代码,发现虽然正常的 NullBooleanField 选择确实分别映射None, True, Falseto 1, 2,3但 RadioSelect 映射1True, 0toFalse和任何其他值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'
)
于 2013-08-15T08:47:51.793 回答
5

出于某种奇怪的原因——我没有在 Django 代码中检查它——一旦你为 NullBooleanField 提供了一个自定义小部件,它就不再接受你期望的值(NoneTrueFalse

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

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

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'

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

于 2012-08-16T18:32:57.150 回答
1

对我来说,在 Django 1.7 中,默认情况下没有选择 None 值(尽管 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
于 2015-03-06T20:18:13.257 回答
1

对于它的价值,这里给出的其他答案不再适用于 Django 1.7。设置choices[(True, "Yes"), (False, "No"), (None, "N/A")]工作正常。

于 2015-02-01T12:48:04.357 回答
0

我已经用 Django 2.2 实现了这一点。

您应该能够使用和小部件None检查单选选项。诀窍是将选择值设置为空字符串。ChoiceFieldRadioSelectNone''

我使用的模型字段BooleanFieldnull=True模型字段基本相同NullBooleanField

approved = forms.ChoiceField(
    choices=[(True, 'Yes'), (False, 'No'), ('', 'N/A')],
    widget=forms.RadioSelect,
    required=False,
)
于 2020-04-18T01:39:20.813 回答