2014-04-22 2 views
0

등록 양식을 작성하여 DB를 확인하여 사용자의 이메일이 새로운 것인지 확인하고 싶습니다.Django : 사용자 등록의 modelform 코드 작성 방법

하지만 문제는 내가 어떻게 만드는지 모른다는 것입니다. unique = True to Field 및 clean_email() 메소드를 사용해 보았습니다.

나는 2 개의 질문이 있습니다.

1) unique = True 일 때 ValidationError가 발생하면 어떻게 그 오류를 잡을 수 있습니까? 모델의 clean_field() 메소드 을 재정의해야합니까? 어떻게 할 수 있니?

2)이 등록 앱에 대해 어떻게 효율적이고 멋진 코드를 작성할 수 있습니까?

다음은 내가 작성한 소스 코드입니다.

# models.py 
from django.db import models 

class User(models.Model): 
    university = models.ForeignKey('University') 
    mail = models.EmailField(unique=True) 
    password = models.CharField() 
    nickname = models.CharField() 


class University(models.Model): 
    name = models.CharField() 
    mail = models.CharField() 


from django.forms import ModelForm 

class LoginForm(ModelForm): 
    class Meta: 
     model = User 
     fields = ('mail', 'password') 

class RegisterForm(ModelForm): 
    class Meta: 
     model = User 

    def clean_mail(): 
     data = self.cleaned_data['mail'] 
     if User.objects.filter(mail=data).exists(): 
      raise forms.ValidationError("This email is already exists") 

# views.py 

def register(request): 
    if request.method == 'POST': 
     ### 
     if form.is_valid(): 

나는 이것을 만들기에 너무 혼란 스럽다. https://docs.djangoproject.com/en/dev/ref/models/instances/

는 '객체 유효성 검사는 "모델 검증의 단계를 안내 :

답변

1

오류가 발생하지 않습니다. Django는 여러분에게 도움을줍니다 : form.is_valid()에 전화하면 clean_field 메소드를 호출하고 ValidationError 예외를 포착하여 form.errors 속성에 넣습니다.

그럼, 이미 가지고있는 것은 괜찮습니다.

의 중요하고 거대한 절대적으로 중요한 문제를 제외하면 일반 텍스트에 암호를 저장하면 안됩니다. 독자적인 독립 실행 형 사용자 클래스를 만들지 마십시오. AbstractBaseUser에서 상속하고 장고의 기본 제공 메서드를 사용하여 사용자를 만들고 암호를 해시합니다. 이런 식으로해서는 안됩니다.

+0

고마워요! 하지만 어떻게 정보를 얻을 수 있습니다 AbstractBaseUser 및 장고의 기본 제공 메서드에 대한? – nextdoordoc

+0

[포괄적 인 문서] (https://docs.djangoproject.com/en/1.6/topics/auth/customizing/#substituting-a-custom-user-model)를 살펴 보지 않겠습니까? –

+0

한 번 더 물어 볼 수 있습니까? 그러나 unique = 데이터베이스 트러스트 유효성 검사 오류를 표시 할 때 나타나는 오류 메시지를 구성하는 방법은 무엇입니까? 장고 1.5 매뉴얼에서 찾을 수 없습니다 ... – nextdoordoc

0

은 다음 페이지에서 빠른 봐) 나는 사전에 도움을 주셔서 감사 기다리고있다.

User.mail에 단일 열 고유성이 필요한 경우 키워드를 Charfield에 추가하기 만하면됩니다. validate_unique()의 재고 구현이이를 처리합니다.

+0

이 양식 유효성 검사에 대한 질문이 검증을 모델링하지입니다 : g 당신이 여기 참조 찾을 수있는 ModelForm

class RegisterForm(ModelForm): mail = forms.EmailField(max_length=255, error_messages = { 'unique': 'xyz....',}) class Meta:....... 

의 상단에 정의합니다. –

1

오류가 발생하지 않은 경우 clean_mail()은 self.cleaned_data [ 'mail']을 먼저 반환해야합니다. 오류가 발생하지 않은 경우 여기에 clean_mail은 필요하지 않지만

두 번째로 Django 은 모델에 unique = Ture를 설정하면 이메일의 고유성을 자동으로 검사합니다. 고유하지 않은 경우 오류가 발생합니다. ModelForm의 메타 옵션에서 제공하는 고유 한 오류 텍스트를 오버 라이드 (over-ride) 할 수 있습니다.

class RegisterForm(ModelForm): 
    class Meta: 
     model = User 
     error_messages = { 
      'mail': { 
       'unique': _("This email already exists"), 
      }, 
     } 

참고 : 옵션은 ... 이전 버전의 장고 V1.6에 추가되었습니다 error_messages :

당신은 직접 ModelForm의 필드 메일을 오버 탈 수 있습니다. 이자형.https://docs.djangoproject.com/en/1.5/ref/forms/fields/#error-messages

+0

어디 ModelForm의 메타 옵션 error_messages에 대한 참조를 찾을 수 있습니까? 나는 장고 1.5 매뉴얼에서 찾을 수 없었다. – nextdoordoc

+1

error_messages 옵션은 1.6 버전에서 추가되었다 : https : //docs.djangoproject.com/en/1.6/topics/forms/modelforms/# default-fields를 오버라이드하는 것입니다. –

+1

그러나 1.5 버전에서는 ModelForm에서 필드 메일을 직접 오버 라이딩 할 수 있습니다. 예 : ModelForm 상단에 정의하십시오.mail = forms.EmailField (max_length = 255, error_messages = { 'unique': 'xyz ....',)) 여기에서 참조 할 수 있습니다. https : //docs.djangoproject .com/ko/1.5/ref/forms/fields/# 오류 메시지 –