Django模型形式中的反向逻辑

Django模型形式中的反向逻辑,django,django-forms,Django,Django Forms,我在Django中有一个模型,其中有一个publicboolean字段,用于控制条目是公共的还是私有的 然而,在表单中,我应该显示一个反向逻辑:一个用于private设置的复选框 class MyModelForm(forms.ModelForm): private = forms.BooleanField(label="Make this entry private") class Meta: model = models.MyModel 如何从这里开始?这

我在Django中有一个模型,其中有一个
public
boolean字段,用于控制条目是公共的还是私有的

然而,在表单中,我应该显示一个反向逻辑:一个用于
private
设置的复选框

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

    class Meta:
        model = models.MyModel

如何从这里开始?

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

prepare\u 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

[更新的答案。上一个答案只处理保存切换后的表单值,当值已经存在时,不会正确显示它。]

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

HTML模板:

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

私有:{form.public}


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

eeh这有点糟糕。如果将clean方法更改为返回相反的值,那么在调用modelform save时也会保存这个相反的值。这正是获得相反值的目标。这个方法似乎是最容易实现的。我从他的信息中了解到,他想显示相反的值,而不是保留/保存它。@Odif也许我们都对了一半。我之前的回答在显示值时不起作用。谢谢你指出这一点!我更新了答案以处理保存和显示。
<form>
    <p>Private: {{ form.public }}</p>
</form>