바스티안, 나는 당신에게 내 코드 템플릿을 설명, 나는 당신에게 도움이되기를 바랍니다 : django 1.2 it is able to write validation code on model 이후
합니다. modelforms로 작업 할 때 instance.full_clean()이 폼 유효성 검사에서 호출됩니다. 각 모델에서
나는 (이 방법은 자동으로 modelform 검증에() full_clean에서 호출) 사용자 정의 기능
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
파일에 내가 bussiness의 규칙을 작성합니다.
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
그런 issues.models 수입 문제에서
, modelform 모델의 청소 방법 및 올바른 상태에 대한 내 custon 기능 검사를 호출 또한 내가 잘못 상태 모델을 저장 방지하기 위해 내 사용자 지정 기능에 pre_save()
연결 모델 양식에서 처리하는 오류를 발생시킵니다.
양식의 오류를 표시하려면 양식 서식 파일에 포함되어야합니다
{% if form.non_field_errors %}
{% for error in form.non_field_errors %}
{{error}}
{% endfor %}
{% endif %}
이유는 non_field_errors 오류 사전 항목에 바인더 제본이 모델 검증하는 오류 제단이다.
저장하거나 당신이 오류가 발생 될 수 있음을 유의 형태 중 모델 삭제 :
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 )
: 또한
try:
issue.delete()
except ValidationError, e:
import itertools
errors = list(itertools.chain(*e.message_dict.values()))
, 당신은 어떤 modelforms에 양식 사전에 오류를 추가 할 수
이 코드는 save() 메서드에서 실행되지 않습니다. 모델의 save() 메서드를 호출 할 때 full_clean()이 자동으로 호출되지 않으며 ModelForm 유효성 검사의 결과로도 사용되지 않습니다.그런 다음 없는 modelforms에 양식 사전에 오류를 추가 할 수 있습니다뿐만 아니라 ValidationError를 가져해야
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 )
당신이 바로 내가에 내 검증을 이동있어 양식, 그것은 더 쉬운 방법입니다. 방금 모델에 모든 것을 넣을 생각이 맘에 들어요. – Bastian
@bastian, 나는 또한 모든 것을 모델에 넣는 것을 좋아했습니다. 새 양식을 작성할 때 비즈니스 규칙을 잊어 버릴 수는 있지만 비즈니스 규칙이 모델에 포함되어있는 것은 아닙니다. 이러한 이유로 저는 게시물에서 설명하는대로 양식에서 모델로 유효성 검사를 이동했습니다. 나는 그것이 더 우아한 방법으로 이것을하는 새로운 방법에 대해 배우기 위해 열려 있습니다. 어쨌든 양식에 유효성 검사 코드를 쓰는 것을 피합니다. – danihp
유효성 검사기를 사용하거나'clean()'메소드를 작성하여 모델에 유효성 검사를하는 것이 좋습니다. 내가 말한 것은'save()'메소드가 정확한 위치가 아니라는 것입니다. [validating objects] (https://docs.djangoproject.com/en/dev/ref/models/instances/#validating-objects)에서 문서를보십시오. – Alasdair