我在Django中有一个带有public
布尔字段的模型,该字段控制条目是公共的还是私有的。
但是,在表单中,我应该显示一个反向逻辑:private
设置的复选框。
class MyModelForm(forms.ModelForm):
private = forms.BooleanField(label="Make this entry private")
class Meta:
model = models.MyModel
我该如何离开这里?
答案 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>
当然,在这种情况下,您需要在提交表单后撤消用户输入以更正切换。