Django ModelForm中的反转逻辑

时间:2014-01-28 23:42:35

标签: django django-forms

我在Django中有一个带有public布尔字段的模型,该字段控制条目是公共的还是私有的。

但是,在表单中,我应该显示一个反向逻辑:private设置的复选框。

class MyModelForm(forms.ModelForm):
    private = forms.BooleanField(label="Make this entry private")

    class Meta:
        model = models.MyModel

我该如何离开这里?

2 个答案:

答案 0 :(得分:6)

这是一个自定义表单字段,它接受一个布尔值并翻转它。模型的public字段保持不变,但表单将使用此新字段显示相反的private值。

prepare_value翻转模型的值以在表单上显示相反的值。 to_python从提交的表单中获取任何传入的值并翻转它以准备保存到模型中。

class OppositeBooleanField(BooleanField):
    def prepare_value(self, value):
        return not value  # toggle the value when loaded from the model

    def to_python(self, value):
        value = super(OppositeBooleanField, self).to_python(value)
        return not value  # toggle the incoming value from form submission


class MyModelForm(forms.ModelForm):
    public = OppositeBooleanField(label='Make this entry private', required=False)

    class Meta:
        model = MyModel

[更新回答。上一个答案仅处理保存切换的表单值,而不是在值已存在时正确显示。]

答案 1 :(得分:0)

您还可以选择在模板中显示“private”,同时保持django modelform字段本身为“public”

class MyModelForm(forms.ModelForm):
    public = forms.BooleanField(label="Make this entry private")

    class Meta:
        model = models.MyModel

HTML模板:

<form>
    <p>Private: {{ form.public }}</p>
</form>

当然,在这种情况下,您需要在提交表单后撤消用户输入以更正切换。