Django ModelForm中的反向逻辑

3

我在Django中有一个模型,其中包含一个名为public的布尔字段,用于控制条目是公开还是私有。

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

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

    class Meta:
        model = models.MyModel

我应该从哪里开始?

2个回答

8
这里有一个自定义表单字段,它接受布尔值并将其翻转。模型的“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

[更新的回答。之前的回答只处理了保存切换的表单值,而未正确显示已存在的值。]


这有点糟糕。如果您将clean方法更改为返回相反的值,则在调用modelform save时也将保存此相反的值。 - Odif Yltsaeb
这正是目标,获取相反的值。这种方法看起来最容易实现。 - JCotton
我从他的信息中理解到,他想展示相反的值,而不是保留/保存它。 - Odif Yltsaeb
@Odif也许我们两个都有一半是对的。我的先前答案在显示值时无效。谢谢你指出来!我更新了答案以处理保存和显示。 - JCotton

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>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接