Вызов ошибки проверки в методе сохранения модели в Django
Я не уверен, как правильно поднять ошибку проверки в методе сохранения модели и отправить обратно четкое сообщение пользователю.
в основном я хочу знать, как каждая часть "Если" должна заканчиваться, та, где я хочу поднять ошибку и тот, где он действительно спасает:
def save(self, *args, **kwargs):
if not good_enough_to_be_saved:
raise ValidationError
else:
super(Model, self).save(*args, **kwargs)
тогда я хочу знать, что делать, чтобы отправить ошибку проверки, которая говорит точно пользователю, что не так, как один Django автоматически возвращает, если, например, значение не уникальный. Я использую (ModelForm) и настраиваю все из модели.
2 ответов
большинство представлений Django, например, администратор Django не сможет обработать ошибку проверки в методе сохранения, поэтому ваши пользователи получат 500 ошибок.
вы должны выполнить проверку на форме модели или на модели и поднять ValidationError
там. Тогда звоните save()
только если данные формы модели "достаточно хороши для сохранения".
Бастиан, я объясняю вам мой шаблон кода, я надеюсь, что это поможет вам:
С django 1.2 он может писать код проверки на модели. Когда мы работаем с modelforms, экземпляр.full_clean () вызывается при проверке формы.
в каждой модели я перезапишусь clean()
метод с пользовательской функцией (этот метод автоматически вызывается из full_clean () при проверке modelform):
from django.db import models
class Issue(models.Model):
....
def clean(self):
rules.Issue_clean(self) #<-- custom function invocation
from issues import rules
rules.connect()
затем в rules.py
файл я пишу деловитость правила. Также подключаю pre_save()
к моей пользовательской функции, чтобы предотвратить сохранение модели с неправильным состоянием:
из вопросов.проблема импорта моделей
def connect():
from django.db.models.signals import post_save, pre_save, pre_delete
#issues
pre_save.connect(Issue_pre_save, sender = Incidencia )
post_save.connect(Issue_post_save, sender = Incidencia )
pre_delete.connect(Issue_pre_delete, sender= Incidencia)
def Incidencia_clean( instance ): #<-- custom function
import datetime as dt
errors = {}
#dia i hora sempre informats
if not instance.dia_incidencia: #<-- business rules
errors.setdefault('dia_incidencia',[]).append(u'Data missing: ...')
#dia i hora sempre informats
if not instance.franja_incidencia:
errors.setdefault('franja_incidencia',[]).append(u'Falten Dades: ...')
#Només es poden posar incidències més ennlà de 7 dies
if instance.dia_incidencia < ( dt.date.today() + dt.timedelta( days = -7) ):
errors.setdefault('dia_incidencia 1',[]).append(u'''blah blah error desc)''')
#No incidències al futur.
if instance.getDate() > datetime.now():
errors.setdefault('dia_incidencia 2',[]).append(u'''Encara no pots ....''')
...
if len( errors ) > 0:
raise ValidationError(errors) #<-- raising errors
def Issue_pre_save(sender, instance, **kwargs):
instance.clean() #<-- custom function invocation
затем modelform вызывает метод clean модели и моя функция custon проверяет правильное состояние или вызывает ошибку, которая обрабатывается формой модели.
чтобы показать ошибки в форме, вы должны включить это в шаблон формы:
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
{{error}}
{% endfor %}
{% endif %}
причина в том, что проверка модели erros ara привязана к non_field_errors словарной ошибки.
при сохранении или удалении модели из формы следует помнить, что может возникнуть ошибка:
try:
issue.delete()
except ValidationError, e:
import itertools
errors = list( itertools.chain( *e.message_dict.values() ) )
кроме того, вы можете добавить ошибки в словарь форм на No modelforms:
try:
#provoco els errors per mostrar-los igualment al formulari.
issue.clean()
except ValidationError, e:
form._errors = {}
for _, v in e.message_dict.items():
form._errors.setdefault(NON_FIELD_ERRORS, []).extend( v )
помните, что этот код не выполняется при методе save (): обратите внимание, что full_clean() не будет вызываться автоматически при вызове метода save() вашей модели, а также в результате проверки ModelForm. Затем вы можете добавить ошибки в словарь форм на нет modelforms:
try:
#provoco els errors per mostrar-los igualment al formulari.
issue.clean()
except ValidationError, e:
form._errors = {}
for _, v in e.message_dict.items():
form._errors.setdefault(NON_FIELD_ERRORS, []).extend( v )