Django模型形式中的反向逻辑
我在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 如何从这里开始?这
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>