【问题标题】:Django custom validation of multiple fieldsDjango自定义验证多个字段
【发布时间】:2012-11-30 12:19:22
【问题描述】:

我想在自定义清理方法中验证多个字段。

到目前为止我有这个:

class ProjectInfoForm(forms.Form):
    module = forms.ModelChoiceField(
        queryset=Module.objects.all(),
    )
    piece = forms.CharField(
        widget=forms.Select(),
        required=False,
    )
    span = forms.IntegerField(
        max_value=100,
        initial=48
    )
    max_span = forms.IntegerField(
        max_value=100,
        initial=0
    )


    def clean(self):
        span = self.cleaned_data['span']
        max_span = self.cleaned_data['max_span']
        piece = self.cleaned_data.['piece']

        # validate piece 
        try:
            Piece.objects.get(pk=m)
        except Piece.DoesNotExist:
            raise forms.ValidationError(
                'Illegal Piece selected!'
            )
            self._errors["piece"] = "Please enter a valid model"

        # validate spans
        if span > max_span:
            raise forms.ValidationError(
                'Span must be less than or equal to Maximum Span'
            )
            self._errors["span"] = "Please enter a valid span"
        return self.cleaned_data

但是,如果两个子句都无效,这只会给我一条消息。如何获取所有无效消息。此外,我没有收到特定字段的消息 - 如何包含要为特定字段显示的消息?

非常感谢任何帮助。

【问题讨论】:

    标签: django django-forms


    【解决方案1】:

    存储错误并且在方法结束之前不要引发它们:

    def clean(self):
        span = self.cleaned_data['span']
        max_span = self.cleaned_data['max_span']
        piece = self.cleaned_data.['piece']
        error_messages = []
    
        # validate piece 
        try:
            Piece.objects.get(pk=m)
        except Piece.DoesNotExist:
            error_messages.append('Illegal Piece selected')
            self._errors["piece"] = "Please enter a valid model"
    
        # validate spans
        if span > max_span:
            error_messages.append('Span must be less than or equal to Maximum Span')
            self._errors["span"] = "Please enter a valid span"
    
        if len(error_messages):
            raise forms.ValidationError(' & '.join(error_messages))
    
        return self.cleaned_data
    

    【讨论】:

    • 应该在表单的 clean_FIELDNAME 方法中验证仅涉及单个字段。
    • 这个答案对我有用 - 那么这种方法是否存在固有问题?
    • @DarwinTech 不是真的,但 clean 方法在概念上是用于跨表单(多字段)验证的。单个字段应该有自己的 clean_FIELDNAME 方法。
    • 好的。但是我的实例确实验证了多字段,不是吗?我正在一起验证 span 和 max_span。
    • 您的意思是self.add_error(field_name, message) 而不是self._error[field_name]=message?您还应该考虑使用_ - 私有变量的原因。
    【解决方案2】:

    在这种情况下,您应该编写自定义 clean_FIELDNAME 方法。这样,以后在模板中使用 {{form.errors}} 时,可以显示以字段为中心的验证错误。 clean 方法 o.t.h.用于验证跨越多个字段的逻辑。看看我上面发布的链接,你需要知道的关于验证 django 表单的一切都在那里。

    【讨论】:

      【解决方案3】:

      这是因为您使用的是raise。 尝试用代码中的这两行替换它:

      del self.cleaned_data['piece']
      

      del self.cleaned_data['span']
      

      【讨论】:

        【解决方案4】:

        这似乎在更高版本的 Django 中发生了变化(这似乎在 2.1 及更高版本中有效):

        
        from django import forms
        
        class ContactForm(forms.Form):
            # Everything as before.
            ...
        
            def clean(self):
                cleaned_data = super().clean()
                cc_myself = cleaned_data.get("cc_myself")
                subject = cleaned_data.get("subject")
        
                if cc_myself and subject and "help" not in subject:
                    msg = "Must put 'help' in subject when cc'ing yourself."
                    self.add_error('cc_myself', msg)
                    self.add_error('subject', msg)
        

        https://docs.djangoproject.com/en/dev/ref/forms/validation/#raising-multiple-errors 有更多详细信息。

        【讨论】:

          猜你喜欢
          • 2015-09-25
          • 2011-09-16
          • 2017-06-21
          • 2015-10-18
          • 1970-01-01
          • 2016-02-01
          • 1970-01-01
          • 2020-10-24
          • 1970-01-01
          相关资源
          最近更新 更多