1) Да, проверка модели вполне допустима.Вот почему ребята из Django добавили его.Формы не всегда используются в процессе сохранения моделей, поэтому, если проверка выполняется только через формы, у вас будут проблемы.Конечно, в прошлом люди обходили это ограничение, переопределяя метод save
и включая проверку таким образом.Тем не менее, новая валидация модели является более семантической и дает вам возможность подключиться к процессу валидации при фактическом использовании формы.
2) В документах достаточно ясно сказано, что валидация модели (full_clean
) выполняется, когда ModelForm.is_valid
называется.Однако, если вы не используете ModelForm
или хотите выполнить дополнительную обработку, вам нужно вызвать full_clean
вручную.Вы делаете это, но неправильный подход - это переопределить save
.Помните: «Явное лучше, чем неявное».Кроме того, save
вызывается во многих других местах и способах, и в случае ModelForm, вы на самом деле в конечном итоге выполните full_clean
в два раза больше.
Тем не менее, так как документы говорят, чтоModelForm
делает full_clean
автоматически, я подумал, что было бы разумно увидеть, как он обрабатывает ошибки.В методе _post_clean
, начиная со строки 323 django.forms.models :
# Clean the model instance's fields.
try:
self.instance.clean_fields(exclude=exclude)
except ValidationError, e:
self._update_errors(e.message_dict)
# Call the model instance's clean method.
try:
self.instance.clean()
except ValidationError, e:
self._update_errors({NON_FIELD_ERRORS: e.messages})
В свою очередь, код для _update_errors
начинается со строки 248 того же модуля:
def _update_errors(self, message_dict):
for k, v in message_dict.items():
if k != NON_FIELD_ERRORS:
self._errors.setdefault(k, self.error_class()).extend(v)
# Remove the data from the cleaned_data dict since it was invalid
if k in self.cleaned_data:
del self.cleaned_data[k]
if NON_FIELD_ERRORS in message_dict:
messages = message_dict[NON_FIELD_ERRORS]
self._errors.setdefault(NON_FIELD_ERRORS, self.error_class()).extend(messages)
Вам придется немного поиграть с кодом, но это должно дать вам хорошую отправную точку для объединения ошибок проверки формы и модели.