首页 > 解决方案 > Django clean() 更改字段要求

问题描述

我想改变一些modelForm字段的要求,如下所示。 certs是一个复选框。如果此复选框为“True”,则ca,certkey字段应为必填项。如果不是,它们应留空(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)

关于如何解决这个问题的任何建议?

标签: pythondjangoformsvalidationmodel

解决方案


尽管使用 Field 类的主要方式是在 Form 类中,但您也可以实例化它们并直接使用它们来更好地了解它们的工作方式。每个 Field 实例都有一个 clean() 方法,该方法接受一个参数并引发 django.forms.ValidationError 异常或返回干净的值:

>>> from django import forms
>>> f = forms.EmailField()
>>> f.clean('foo@example.com') 
'foo@example.com'
>>> f.clean('invalid email address')
Traceback (most recent call last): ... ValidationError: ['Enter a valid email address.']

推荐阅读