Let's dive in: Each individual field contains a list of validators (in this case, just one validator) supplied by Django and any Model Form customizations that might have been done.
If you want to add more validators to a Model Form (perhaps we want our title field to require at least 20 characters) one way to do it is by overriding the field definition in the Model Form class's Now we have two validators for the field!
There are other ways to override the title field validators.
The easiest but not necessarily the best way is to replicate the Model Form definition of the field in the form like so: I don't like this technique.
This makes it so we are defining the title field in two places, once in the model and once in the form.
Since a single model can have multiple forms, and we developers forget or leave projects, you can understanding what sort of security nightmare this can cause. Well, Model Forms do the same thing AND give us the power to save that validated dictionary to SQL tables. This is really useful because it means that we can take data from any source, be it user input from the web, JSON data fetched from an API, and even CSVs generated from Excel reports and transform that into data that resides in SQL.
if getattr(obj, '_nested_forward_relations', None): # Nested relationships need to be saved before we can save the # parent instance.
for field_name, sub_object in obj._nested_forward_relations.items(): if sub_object: self.save_object(sub_object) setattr(obj, field_name, sub_object) ...
One of the nice things about Django is that its forms library protects your models.
It does this by assigning one or more of Django's many built-in validators to the form fields it generates, and using them to check incoming data.