Dans la doc, il est écrit que la méthode Model.full_clean
est appelée après ModelForm.clean
. À cette page, il est écrit que ModelForm.is_valid
fait appel aux trois méthodes de validations, seulement sur les champs spécifiés. En-dessous, il est précisé que Model.full_clean
fait appel successivement à ces trois méthodes, je suppose alors sur tous les champs.
Donc c'est normal que, s'il manque des champs spécifiés dans le ModelForm
, un is_valid
peut valoir True
, même si la méthode Model.full_clean
renvoie une exception, comme montré ci-dessous.
models.py
class Question(models.Model):
short = models.CharField(max_length=10)
intitule = models.TextField()
forms.py
class CreateQuestionForm(forms.ModelForm):
class Meta:
model = Question
fields = ('intitule',)
Test via shell
>>> question_form = CreateQuestionForm(data={'intitule': "Première question"})
>>> print(question_form.is_valid())
True
>>> question = question_form.save()
>>> question.full_clean()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/tmp/django_example/.env/lib/python3.6/site-packages/django/db/models/base.py", line 1249, in full_clean
raise ValidationError(errors)
django.core.exceptions.ValidationError: {'short': ['This field cannot be blank.']}
C'est bien un comportement souhaité?