2015-05-31 43 views
-2

在我的自定义登记表中的字段看起来是这样的:返回错误消息,自定义表单

<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}}

编辑
我已经使用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

您可以在RegFormemail字段中编写自定义清理程序。例如:

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