【发布时间】:2020-03-29 02:38:38
【问题描述】:
我想改变一些modelForm字段的要求,如下所示。
certs 是一个复选框。如果此复选框为“True”,则应需要 ca、cert 和 key 字段。如果不是,它们应留空(null=True 在模型中设置)。
class CreateMVPConnectionsForm(forms.ModelForm):
class Meta:
model = MVPConnections
fields = '__all__'
exclude = ['created_by_user', 'parent_project_id']
def clean(self):
print("clean started")
cleaned_data = super().clean()
certs = cleaned_data.get('certs')
ca = cleaned_data.get('ca')
cert = cleaned_data.get('cert')
key = cleaned_data.get('key')
if certs == True:
if ca and cert and key:
pass
else:
raise ValidationError(_('If certs is checked, please fill in "ca", "cert" and "key".'))
else:
ca = forms.CharField(required=False)
cert = forms.CharField(required=False)
key = forms.CharField(required=False)
关于如何解决这个问题的任何建议?
【问题讨论】:
-
怎么解决?您面临的问题是什么?你告诉我们你想要什么,但你没有说你当前的代码有什么问题。
-
问题是它不像我预期的那样工作。当我这样做时,Django 仍然希望填充“ca”、“cert”和“key”字段。因此,它不应用我在最后一个 else 中所做的需求更改。我征求建议如何实现这一目标(或者在这种情况下我做错了什么)
-
尝试相反的方法 - 默认为
required=False,如果选中certs,则强制验证。 -
您不能像这样实例化新字段。您的
else子句实际上没有做任何事情,您只是将变量ca、cert分配给新字段,但这些变量无论如何都是该方法的本地变量,并且不会对您的表单做任何事情。正如@Gasanov 所提到的,您应该使字段开始时不需要,只需像在 clean 方法中一样引发验证错误(删除else子句)。确保您还在模板中的某处显示form.non_field_errors,以便向用户显示您提出的特定错误。 -
谢谢你和@Gasanov,这种方法帮我解决了!
标签: python django forms validation model