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

时间:2011-09-02 04:28:44

标签: 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'映射到是,否,并相应地要求。

4 个答案:

答案 0 :(得分:30)

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

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

我查看了Django源代码。 Everything 可以接受一个选择数组。显然,对于那些没有意义的,但它是可能的。

答案 1 :(得分:3)

您可以在表格中处理此问题(无需修改模型),如下所示:

forms.NullBooleanField(
    widget=forms.RadioSelect(renderer=HorizontalRadioRendererSpace,
        choices=CHOICES),
    label='...',
    required=False)

我认为将NullBooleanField用于可以处于三种状态的数据是一个坏主意,例如:yes / no / unset。

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

然后“空”值可以有两个含义:

  • 不关心此属性。包括所有行
  • 仅包含列为NULL的这些行。

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

此处有更多详情:https://github.com/guettli/programming-guidelines/blob/master/README.rst

答案 2 :(得分:2)

您可以在ModelForm元类中修改字段小部件:

CHOICES = (
            (None, "I do not know now"),
            (True, "Yes I acknowledge this"),
            (False, "No, I do not like this"),
           )
class DemoForm(forms.ModelForm):
    class Meta:
        model = Demo
        fields = ("demo_field",)
        widgets = {
              'demo_field': forms.RadioSelect(choices = CHOICES),
                  }

答案 3 :(得分:2)

简单的方法是更改​​表单中的窗口小部件选项:

class YourForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super(YourForm, self).__init__(*args, **kwargs)
        new_choices = ((1, 'I do not know now'),
                       (2, 'Yes I acknowledge this'),
                       (3, 'No, I do not like this'))
        self.fields['your_field'].widget.choices = new_choices