2015-05-31 2 views
-2

поля в моей пользовательской форме регистрации выглядит примерно так:Вернуться сообщение об ошибке в пользовательской формы в Django

<div class="form-group"> 
      {{ form.email.errors }} 
     label for="{{form.email.id_for_label}}"> 
     <b>Email</b> 
     </label> 
      {{ form.email }} 
</div> 

Мой views.py выглядит следующим образом:

def registration(request): 
    registered = False 
    if request.method == 'POST': 
     form = RegForm(data=request.POST) 
     if form.is_valid(): 
      email = form.cleaned_data['email'] 
      phone = form.cleaned_data['phone'] 
      password = form.cleaned_data['password'] 
      password2 = form.cleaned_data['password2'] 
      user = User() 
      user.email = email 
      user.username = email 
      user.is_active = False 
      user.set_password(password) 
      user.save() 
      return render(request, 'appname/index.html', {'registered': True}) 
    else: 
     form = RegForm() 
     render(request, 'appname/index.html', {'form': form}) 

forms.py:

class RegForm(forms.Form): 
    email = forms.EmailField(error_messages={'required': 'Please enter your Email ID'}) 
    password=forms.CharField(widget=forms.PasswordInput()) 
    password2=forms.CharField(widget=forms.PasswordInput()) 
    phone= forms.CharField(label="Mobile Number",max_length=10) 

#clean email field 
    def clean_email(self): 
     email = self.cleaned_data["email"] 
     try: 
      User._default_manager.get(email=email) 
     except User.DoesNotExist: 
      return email 
     raise forms.ValidationError('duplicate email') 

Предположим, что если письмо уже существует в БД, как мне вернуть сообщение об ошибке в пользовательскую форму и отобразить ее вместо {{form.email.errors}}

EDIT
Я использовал ValidationError в forms.py и возвращение raise forms.ValidationError('duplicate email'), если адрес электронной почты существует. Как показать эту ошибку в пользовательской форме?

ответ

0

Отвечая на мой вопрос. Я новичок и, следовательно, потратил много времени и сил, чтобы понять это. я просто не хватаю этого в моих взглядах:

if form.is_valid(): 
    #do something, add user ot DB 
    return render(request, 'mudramantri/index.html', {'registered': True}) 
else: 
    return render(request, 'mudramantri/index.html', {'form': form}) 

Поскольку я не возвращался формой, когда форма не является действительной, вид был пуст, и, следовательно, ошибкой.

0

Вы можете написать собственное очиститель для поля email в своем RegForm. Что-то вроде:

class RegForm(forms.Form): 
    # Everything as before. 
    ... 

    #clean email field 
    def clean_email(self): 
     email = self.cleaned_data["email"] 
     if User.objects.filter(email=email).exists(): 
      raise forms.ValidationError('duplicate email') 
     return email 

Это документально here.

+0

Да, я сделал это. Но как мне вернуть эту ошибку в мою форму? – Maxsteel

+0

Если метод верен, он будет отображаться в '{{form.email.errors}}'. Это просто полевая ошибка. Было бы полезно, если бы вы поделились своим * forms.py * – rnevius

+0

Я просто поделился им. Взгляни, пожалуйста? – Maxsteel

0

Существует проблема с логикой представления.

Когда форма оценивается form.is_valid(), тогда будет поднят ValidationError, и ошибки будут доступны в форме.

Если форма недействительна, кажется, что она ничего не возвращает или не делает форму с ошибками, доступными в шаблоне.

def registration(request): 
    registered = False 
    if request.method == 'POST': 
     form = RegForm(data=request.POST) 
     if form.is_valid(): 
      email = form.cleaned_data['email'] 
      phone = form.cleaned_data['phone'] 
      password = form.cleaned_data['password'] 
      password2 = form.cleaned_data['password2'] 
      user = User() 
      user.email = email 
      user.username = email 
      user.is_active = False 
      user.set_password(password) 
      user.save() 
      return render(request, 'appname/index.html', {'registered': True}) 
    else: 
     form = RegForm() 
    return render(request, 'appname/index.html', {'form': form}) 

Также лейбл, кажется, mising отверстие <

<div class="form-group"> 
     {{ form.email.errors }} 
    <label for="{{ form.email.id_for_label }}"> 
    <b>Email</b> 
    </label> 
     {{ form.email }} 
    </div> 

Как примечание стороны, я хотел бы предложить, чтобы перенаправить пользователя с GET запроса после того, как пользователь был успешно создан, чтобы избежать какой-либо пользователь может случайно перезагрузить и отправить другую полезную нагрузку. например

return redirect('/confirmation/') 
+0

Эй, не могли бы вы рассказать мне, что должно быть правильным регистрационным представлением? Разве это не так, как у меня? Как обращаться с ValidationError? – Maxsteel

+0

Разница заключалась в том, что вы не возвращали форму как часть контекста. как вы отметили в ответе, который вы отметили как действительный. – Alfredo

Смежные вопросы