Django ModelForm中的反转逻辑

Luí*_*rme 3 django django-forms

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

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

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

    class Meta:
        model = models.MyModel
Run Code Online (Sandbox Code Playgroud)

我该怎么走?

JCo*_*ton 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
Run Code Online (Sandbox Code Playgroud)

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