【问题标题】:Django form validation: making "required" conditional?Django表单验证:使“必需”有条件?
【发布时间】:2011-01-19 09:24:48
【问题描述】:

我是 Django(和 Python)的新手,我正在尝试弄清楚如何对表单验证的某些方面进行条件化。在这种情况下,应用程序有一个 HTML 界面,用户可以在其中从小部件中选择日期和时间。表单对象上的clean 方法获取时间和日期字段的值并将它们转换回datetime

除了 HTML 界面,还有一个 iPhone 客户端调用应用程序,我想传入一个 UNIX 时间戳样式的时间值。

我的表单代码如下所示:

class FooForm(forms.ModelForm):
    foo_date             = forms.CharField(required=True, widget=forms.RadioSelect(choices=DATE_CHOICES))
    foo_time             = forms.CharField(required=True, widget=SelectTimeWidget())
    foo_timestamp        = forms.CharField(required=False)

如何使foo_datefoo_time 成为必需除非 提供foo_timestamp

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    我发现自己需要一种“标准”方式来执行此操作,因为我的表单有几个有条件的必填字段。所以我用下面的方法创建了一个超类:

    def validate_required_field(self, cleaned_data, field_name, message="This field is required"):
        if(field_name in cleaned_data and cleaned_data[field_name] is None):
            self._errors[field_name] = self.error_class([message])
            del cleaned_data[field_name]
    

    然后在我的表单的干净方法中,我有:

    def clean(self):
        cleaned_data = super(FormClass, self).clean()
        if(condition):
            self.validate_required_field(cleaned_data, 'field_name')
    

    到目前为止,它对我来说非常有效。

    【讨论】:

      【解决方案2】:

      这是通过表单上的clean 方法完成的。不过,您需要将foo_datefoo_time 设置为required=False,因为clean 仅在每个字段都经过验证后才会调用(另请参阅documentation)。

      class FooForm(forms.Form)
          # your field definitions
      
          def clean(self):
              data = self.cleaned_data
              if data.get('foo_timestamp', None) or (data.get('foo_date', None) and data.get('foo_time', None)):
                  return data
              else:
                  raise forms.ValidationError('Provide either a date and time or a timestamp')
      

      【讨论】:

      • 谢谢,我在想clean 可能是这样做的地方。但是,是否有可能出现针对 foo_datefoo_time 字段的验证错误,而不是一般的表单验证错误?谢谢,克里斯
      • 这在我链接到的文档的第二个示例中进行了解释
      猜你喜欢
      • 2021-02-01
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多