你如何使django表单验证动态化?

时间:2010-06-04 10:56:43

标签: django forms

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

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

如何覆盖FileFieldURLField验证器,以便Django仅在上述两个字段都无效时才引发错误,但只要另一个无效,则只有一个无效?

4 个答案:

答案 0 :(得分:7)

您需要将它们设置为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 mot url_address :
           raise forms.ValidationError("Provide a valid file or a valid URL.")

       return cleaned_data          

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

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

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_name2的输入不是field_name,这会使'SOMETHING'成为必填字段。 Django摇滚!

答案 3 :(得分:0)

您应该查看此软件包django-dynamic-model-validation

from django.db import models
from dynamic_validator import ModelFieldRequiredMixin


class MyModel(ModelFieldRequiredMixin, 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']

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