Correct Way to Validate Django Model Objects?

I had a similar misunderstanding of the ORM when I first started with Django.

  1. No, don’t put self.full_clean() inside of save. Either

A) use a ModelForm (which will cause all the same validation to occur – note: ModelForm.is_valid() won’t call Model.full_clean explicitly, but will perform the exact same checks as Model.full_clean). Example:

class PersonForm(forms.ModelForm):
    class Meta:
        model = Person

def add_person(request):
    if request.method == 'POST':
        form = PersonForm(request.POST, request.FILES)
        if form.is_valid():  # Performs your validation, including ``validate_gender``
            person = form.save()
            return redirect('some-other-view')
    else:
        form = PersonForm()
        # ... return response with ``form`` in the context for rendering in a template

Also note, forms aren’t for use only in views that render them in templates – they’re great for any sort of use, including an API, etc. After running form.is_valid() and getting errors, you’ll have form.errors which is a dictionary containing all the errors in the form, including a key called '__all__' which will contain non-field errors.

B) Simply use model_instance.full_clean() in your view (or other logical application layer), instead of using a form, but forms are a nice abstraction for this.

  1. I don’t really have a solution to, but I’ve never run into such a problem, even in large projects (the current project I work with my company on has 146 tables) and I don’t suspect it’ll be a concern in your case either.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)