【问题标题】:Django clean() change field requirementDjango clean() 更改字段要求
【发布时间】:2020-03-29 02:38:38
【问题描述】:

我想改变一些modelForm字段的要求,如下所示。 certs 是一个复选框。如果此复选框为“True”,则应需要 cacertkey 字段。如果不是,它们应留空(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 子句实际上没有做任何事情,您只是将变量 cacert 分配给新字段,但这些变量无论如何都是该方法的本地变量,并且不会对您的表单做任何事情。正如@Gasanov 所提到的,您应该使字段开始时不需要,只需像在 clean 方法中一样引发验证错误(删除else 子句)。确保您还在模板中的某处显示form.non_field_errors,以便向用户显示您提出的特定错误。
  • 谢谢你和@Gasanov,这种方法帮我解决了!

标签: python django forms validation model


【解决方案1】:

虽然您使用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.']

【讨论】:

    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 2012-04-15
    • 2017-02-28
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多