【问题标题】:How do you make django form validation dynamic?你如何使 django 表单验证动态化?
【发布时间】:2011-02-27 17:49:22
【问题描述】:

我的表单需要有一个有效的 url 或一个有效的文件才能上传:

class ResourceUpload(ModelForm):
   ...        
   uploadedfile = forms.FileField('file')
   url_address = forms.URLField('url') 
   ...

如何覆盖 FileField 和 URLField 验证器,以便 Django 仅在上述两个字段都无效时引发错误,但只要另一个字段有效,一个无效的除外?

【问题讨论】:

    标签: django forms


    【解决方案1】:

    您需要将它们都设置为required=False,因此数据库后端不需要它们都填写,然后使用form cleaning:

    import forms
    
    class ResourceUpload(ModelForm):
       ...        
       uploadedfile = forms.FileField(required = False, upload_to='put/files/here')
       url_address = forms.URLField(required = False) 
       ...
    
       def clean(self):
           cleaned_data = self.cleaned_data
           uploadedfile = cleaned_data.get("uploadedfile ")
           url_address = cleaned_data.get("url_address ")
    
           if not uploadedfile and not url_address :
               raise forms.ValidationError("Provide a valid file or a valid URL.")
           
           return cleaned_data          
    

    【讨论】:

      【解决方案2】:

      我的解决方案
      优点:它为真正需要的字段和默认错误消息保留星号

      class Form(forms.ModelForm):
          field1 = SelectField
          field2 = ...
          field3 = ...
      
          def __init__(self, *args, **kwargs):
              super(Form, self).__init__(*args, **kwargs)
              if kwargs['data']:
                  if kwargs['data'].get('field1') == '1':
                      self.fields['field2'].required = True
                      self.fields['field3'].required = False
                  elif kwargs['data'].get('field1') == '2':
                      self.fields['field2'].required = False
                      self.fields['field3'].required = True
      

      【讨论】:

        【解决方案3】:

        这是我真正有效的解决方案...(已测试)

        def __init__(self, *args, **kwargs):
            super(YourForm, self).__init__(*args, **kwargs)
        
            if self.data and self.data.get('field_name') != 'SOMETHING':
                self.fields.get('field_name2').required = True
        

        如果field_name 的输入不是'SOMETHING',这会使field_name2 成为必填字段。 Django 摇滚!

        【讨论】:

        • Django 真的很棒!
        【解决方案4】:

        你应该看看这个包django-extra-field-validation

        from django.db import models
        from extra_validator import FieldValidationMixin
        
        
        class MyModel(FieldValidationMixin, models.Model):
            uploadedfile = models.FileField(upload_to='upload/path', blank=True, default='')
            url_address = models.URLField(blank=True, default='') 
            
            REQUIRED_TOGGLE_FIELDS = ['uploadedfile', 'url_address']
        

        这将验证只能提供其中一个字段,如果两者都使用,则会引发验证错误。

        【讨论】:

        • 请不要只发布一些工具或库作为答案。至少在答案本身中展示how it solves the problem。
        • 您不要太快发表评论,因为我已经添加了用法。
        • 是的,那是在评论之后。当这个问题在 8 年前被问到时,FGITW 不是问题。只需在第一个修订版中添加它,您就不会得到 cmets 和 flags。我已经收回了我的
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-03
        • 2012-08-30
        • 2020-11-27
        • 1970-01-01
        • 1970-01-01
        • 2021-12-20
        • 1970-01-01
        相关资源
        最近更新 更多