Django form validation: making “required” conditional?

不想你离开。 提交于 2019-12-30 08:08:04

问题


I'm new to Django (and Python), and am trying to figure out how to conditionalize certain aspects of form validation. In this case, there's a HTML interface to the application where the user can choose a date and a time from widgets. The clean method on the form object takes the values of the time and date fields and turns them back into a datetime.

In addition to the HTML interface, there's also an iPhone client making calls into the application, and I'd like to pass a UNIX timestamp-style time value in.

My form code looks like this:

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)

How do I make foo_date and foo_time required unless foo_timestamp is provided?


回答1:


This is done with the clean method on the form. You need to set foo_date and foo_time to required=False, though, because clean is only called after every field has been validated (see also the 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')



回答2:


I found myself needing a "standard" way to do this, as my forms have several conditionally required fields. So I created a superclass with the following method:

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]

And then in my form's clean method I have:

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

It's worked perfectly for me so far.



来源:https://stackoverflow.com/questions/2306800/django-form-validation-making-required-conditional

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!