django:如何在模型中更改nullbooleanfield的值?

goh*_*goh 14 django django-models django-forms

在文档中,nullbooleanfield表示as a <select> box with "Unknown", "Yes" and "No" choices.如何更改select其他更有意义的文本的值,并将其映射回我的是,否和未知值modelform

例如,我有yes_no_required = models.NullBooleanField(),我想拥有'yes I acknowledge this','no, I do not like this''I do not know now'映射到是,否,并相应地要求.

Elf*_*erg 31

我花了半个小时拼凑一个演示,以证明自己的作品:

CHOICES = (
    (None, "I do not know now"),
    (True, "Yes I acknowledge this"),
    (False, "No, I do not like this")
)

class Demo(models.Model):
    yes_no_required = models.NullBooleanField(choices = CHOICES)

class DemoForm(forms.ModelForm):
    class Meta:
        model = Demo
Run Code Online (Sandbox Code Playgroud)

我查看了Django源代码. 一切都可以接受选择阵列.显然,对于一些没有意义的,但它是可能的.

  • 似乎Django为FormField选项添加了Null的另一个选择,因为null-attr设置为true.您还需要将选项传递给FormField,实际上将其限制为这些选择而不是额外的虚线空选. (3认同)
  • 这似乎不再起作用。TypeError:__init __()得到了一个意外的关键字参数'choices'。 (2认同)

gue*_*tli 5

您可以以如下形式处理此问题(无需修改模型):

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace,
        choices=CHOICES),
    label='...',
    required=False)
Run Code Online (Sandbox Code Playgroud)

我认为对可能处于三种状态的数据使用 NullBooleanField 是一个坏主意,例如:是/否/未设置。

编辑数据有效。但如果您想为这些数据编写一个搜索表单,就会出现大麻烦。

那么“空”值可以有两种含义:

  • 不关心这个属性。包括所有行
  • 仅包含这些行,其中列为 NULL。

解决方案很简单:使用 ChoiceField。

更多详细信息请参见:https://github.com/guettli/programming-guidelines/blob/master/README.rst