Вызов ошибки проверки в методе сохранения модели в 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  )