在Django的模型保存方法中引发validation错误
我不知道如何在模型的保存方法中正确地引发validation错误,并向用户发送一条清晰的消息。
基本上我想知道“if”的每个部分应该如何结束,我想提出错误的部分和实际保存的部分:
def save(self, *args, **kwargs): if not good_enough_to_be_saved: raise ValidationError else: super(Model, self).save(*args, **kwargs)
然后,我想知道该怎么做才能发送一个validation错误,该错误恰好向用户说明,就像Django自动返回一个错误,例如一个值不是唯一的。 我正在使用(ModelForm)并调整模型中的所有内容。
大多数Django的意见,例如Djangopipe理员将无法处理validation错误的保存方法,所以你的用户将得到500错误。
你应该在模型表单或模型上进行ValidationError
,并在那里引发ValidationError
。 然后只有在模型表单数据“足够好保存”的情况下调用save()
。
巴斯蒂安,我向你解释我的代码模板,希望对你有所帮助:
由于Django 1.2能够在模型上编写validation码 。 当我们使用模型时,instance.full_clean()在表单validation上被调用。
在每个模型中,我用自定义函数覆盖了clean()
方法(这个方法自动从modelformvalidation的full_clean()中调用):
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()
连接到我的自定义函数,以防止保存具有错误状态的模型:
从issues.models导入问题
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调用model的clean方法,我的custon函数检查一个正确的状态,或者引发一个由model model处理的错误。
为了在窗体上显示错误,你应该在表单模板中包含这个:
{% if form.non_field_errors %} {% for error in form.non_field_errors %} {{error}} {% endfor %} {% endif %}
原因是模型validationerros ara绑定到non_field_errors错误词典条目。
当您保存或删除表单中的模型时,应该记住可能会引发错误:
try: issue.delete() except ValidationError, e: import itertools errors = list( itertools.chain( *e.message_dict.values() ) )
此外,您可以将错误添加到没有模型表单的表单词典中:
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()方法上执行:请注意,调用模型的save()方法时,不会自动调用full_clean(),也不会因为ModelFormvalidation而自动调用full_clean()。 然后,您可以将错误添加到没有模型表单的表单字典中:
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 )
一定要导入ValidationError
from django.core.exceptions import ValidationError