2

registration에서 나는 email-id이 고유하다는 것을 강조하고 있습니다. 즉, 해당 이메일 ID가있는 사용자가 있다면 raiseforms.ValidationError입니다.등록시 이메일 확인이 장고에서 validationError를 발생시키지 않았습니까?

여기 내 form.py입니다 :

from django.contrib.auth.forms import UserCreationForm 
from django.contrib.auth.models import User 

class MyRegistrationForm(UserCreationForm): 
    #define fields 
    email=forms.EmailField(required=True) 

    class Meta: 
     model=User 
     fields=('username','email','password1','password2') 

    def clean_email(self): 
      email = self.cleaned_data["email"] 
      try: 
       user = User.objects.get(email=email) 
       print user.email 
       print user.username 
       raise forms.ValidationError("This email address already exists. Did you forget your password?") 
      except User.DoesNotExist: 
       return email 

    def save(self, commit=True): 
      user = super(MyRegistrationForm, self).save(commit=False) 
      user.email=self.cleaned_data["email"] 
      if commit: 
       user.save() 
      return user 

view.py :

def register_user(request): 
    if request.method=='POST': 
     form=MyRegistrationForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      messages.success(request, "Thank you for signing up") 
      return HttpResponseRedirect("/accounts/register_success") 

    args={} 
    args['form']=MyRegistrationForm() 
    return render(request,"register.html",args) 

내가 같은 이메일 ID와 registeruser, 그것은 validationError를 포기하지 않을 때. register.html 만 반환하면 중복 된 사용자는 추가되지 않습니다.

왜 던지지 않는가 validationError?

은 내가 User.object.get(email=email)에서 얻을 usernameemailprint하는 forms.py (above)print 문장의 몇 가지를 추가하고 그것을 올바르게 name 이전 registered useremail id 인쇄합니다. 그래서 제어가까지 진행하지만 나는 또한 brand new user을 생성하지만, passoword 필드 Not match을 가진 시도 validationError

EDIT:

을 던지는되지 않습니다. 여전히 메시지가 표시되지 않습니다. error. 하지만 단순히 register.html

EDIT로 리디렉션 :

이 템플릿에서

template/register.html

{% extends "base.html" %} 

{% block content %} 


<h2>Register</h2> 
<form action="" method="post">{% csrf_token %} 

{{ form.as_p }} 

<input type="submit" value="register"/> 

</form> 
{% endblock %} 

error는 자동으로 바로 fielderror occurs 위에 표시됩니다. 나는 {{form.email.error}} 할 필요가 없다. 그러나 error을 사용자 정의 할 방법이 없습니다. 예 : bold 또는 일부 CSS. 그게 가능하니?

+1

합니다. 템플릿에''{{form.errors}}''를 추가하고 무슨 일이 일어나는 지보십시오. – Serafeim

+0

템플릿에 아직 도움이되지 않은 것을 추가했습니다. – eagertoLearn

답변

2

장고는 캐치 ValidationError을 제외하고 오류를 추가하여 _errors dict 양식을 만듭니다. 장고 BaseForm._clean_fields 방법에서이 코드 :

 try: 
      # ... 
      if hasattr(self, 'clean_%s' % name): 
       value = getattr(self, 'clean_%s' % name)() 
       self.cleaned_data[name] = value 
     except ValidationError as e: 
      self._errors[name] = self.error_class(e.messages) 
      if name in self.cleaned_data: 
       del self.cleaned_data[name] 

그래서, 당신은 필드 청소에 오류를 추가하고 양식이 유효하지하기 위해 장고를 말하고있다 ValidationError 예외를 발생하여.하나의 필드 오류 (장고 문서 Customizing the form template)

{{ form.field_name.errors }} 

및 반복 :

{% if form.subject.errors %} 
    <ol> 
    {% for error in form.subject.errors %} 
     <li><strong>{{ error|escape }}</strong></li> 
    {% endfor %} 
    </ol> 
{% endif %} 

모든 필드 오류 (장고 문서 Looping over the form’s fields) :

당신은 템플릿에서 필드 오류에 액세스 할 수 있습니다

{% for field in form %} 
    {{ field.errors }} 
    {{ field.label_tag }} {{ field }} 
{% endfor %} 

및 비 필드 오류 표시 :

{{ form.non_field_errors }} 

업데이트 : 당신이보기에 else 블록을 추가해야합니다. else없이 당신은 항상 새로운 형태를 만들 수 있습니다 :이 양식에 오류가 표시되지 않는 HTML 템플릿 냄새

def register_user(request): 
    if request.method=='POST': 
     form=MyRegistrationForm(request.POST) 
     if form.is_valid(): 
      form.save() 
      messages.success(request, "Thank you for signing up") 
      return HttpResponseRedirect("/accounts/register_success") 
    else: 
     form = MyRegistrationForm() 

    args={} 
    args['form'] = form 
    return render(request,"register.html",args) 
+0

필요한 수정 프로그램은 무엇입니까? 나는 당신의 대답으로 명확하지 않다. – eagertoLearn

+0

나는 아무것도주지 않은'{{form.email.errors}} '를 시도했다. 'ValidationError'가'register' 페이지로 리디렉션됩니까 – eagertoLearn

+0

놀라워요! 이것은 도움이되었습니다. 기본적으로 User 모델은 고유 한 UserName을 허용합니다. 즉, 동일한 UserName을 사용하여 새 사용자를 등록하려고 시도하면 등록되지 않지만 form.errors를 던지기 위해 명시 적으로 템플릿을 체크인해야한다고 생각합니다. 하지만 {{form.field_name.errors}}는리스트이거나 에러 또는 문자열 버전일까요? – eagertoLearn

관련 문제