2010-04-13 1 views
1

을 높이는 다음장고 뷰에서 get_or의 _create의 좋은 예 사용을 찾고 내가 달성하는 방법의 좋은 예를 찾고 있어요 양식 오류

내가 get_or_create를 사용하고 싶습니다 이미 대상 여부 확인 내 데이터베이스에 있습니다. 그렇지 않으면 생성 될 것입니다. 존재하지 않으면 새 오브젝트를 작성하지 않지만 사용자에게 다른 데이터 (예 : 다른 사용자 이름)를 입력해야 함을 알리기 위해 양식 오류를 발생시켜야합니다.

보기는 포함이 존재, 또는 새로운 사람이 그렇지 않은 경우

p, created = Person.objects.get_or_create(
    email = registration_form.cleaned_data['email'], 
    defaults = { 
     'creationDate': datetime.datetime.now(),     
     'dateOfBirth': datetime.date(1970,1,1) 
}) 

그래서 'P'는 기존의 사람이 포함됩니다. Person 저장을 건너 뛰고 registration_form을 다시 표시하고 적절한 양식 유효성 검증 오류를 발생 시키려면 'created'의 부울 값에 대해 작업하고 싶습니다.

내가 생각하는 대안은 사용자가 제공된 '전자 메일'필드에 데이터가 있는지 여부를 확인하고 유효성 검사 오류를 제기하는지 확인하기 위해 사용자 지정 양식 유효성 검사 방법을 확인하는 것입니다.

답변

3

이것은 get_or_create의 좋은 사용법이 아닙니다. 양식 유효성 검사 (분명히하려는)는 저장하기 전에 이루어지며 혼합되지 않아야합니다. 저장하기 전에 양식이 유효한지 확인해야하지만 '이미 있음'확인은 유효성 확인의 일부입니다.

try: 
    Person.objects.get(email=...) 
    raise forms.ValidationError(...) 
except Person.DoesNotExist: 
    pass 

이것은 당신이 제안하는 대안이 가장 합리적인 솔루션입니다 : 양식의 깨끗한() 메소드에서

,이 같은 물품.

get_or_create를 잘 사용하면 예를 들어 새로운 태그를 즉시 만들거나 수집 된 이전 태그에 대한 정보를 원하는 곳에 추가 할 수 있습니다.

편집 : 나중에 분리 된 생성/생성 사이클을 피하려면이 작업을 수행하려면 modelforms를 사용해야합니다. modelforms의 save 메소드는 방금 작성한 인스턴스를 리턴합니다.

+0

ModelForms save() 메소드에 대한 팁을 주셔서 감사합니다. 그걸 찾기가 어렵 네요! – pfctdayelise

관련 문제