Django ModelForm custom validation: How to access submitted field values

Mrak picture Mrak · Feb 26, 2013 · Viewed 11.9k times · Source

I have the below model form and want to add custom validation to a field called 'billable_work'.

How do I access a field 'project' which was submitted in the form? I want to check the value of project ('p' in the below example) but can't locate the proper syntax so that I can test the submitted value. Any help would be appreciated.

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entries
        exclude = ('billable_work','notes')  

    billable_work = forms.BooleanField()
    notes = forms.CharField(widget=forms.Textarea,required=False)

    def clean_billable_work(self):
        b = self.cleaned_data['billable_work']
        p = form.fields['project']

        if b == True and p == 523:
            raise forms.ValidationError(_("Entries cannot be both billable and NONE: Indirect."))
        return self.cleaned_data['billable_work']

Answer

Aidan Ewen picture Aidan Ewen · Feb 26, 2013

I think you want to override the clean() method on your model rather than the clean method of a specific form field. From the docs -

This method should be used to provide custom model validation, and to modify attributes on your model if desired. For instance, you could use it to automatically provide a value for a field, or to do validation that requires access to more than a single field.

If you did want to put the validation in the form then the clean() method on the form provides similar functionality (see docs).