巴斯蒂安,我向您解释了我的代码模板,希望对您有所帮助:
从django 1.2 开始,它能够在模型上编写验证代码。当我们使用模型表单时,会在表单验证时调用 instance.full_clean()。
在每个模型中,我clean()
使用自定义函数覆盖方法(此方法在 modelform 验证时从 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()
到我的自定义函数以防止保存状态错误的模型:
从问题.模型导入问题
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 %}
原因是模型验证错误 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(),也不会作为 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 )