Return Django 中自定义表单的错误消息

Return error message to custom form in 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')

假设电子邮件已经存在于数据库中,我如何 return 向自定义表单发送错误消息并将其显示在 {{form.email.errors}}

的位置

编辑
如果电子邮件存在,我在 forms.py 和 returning raise forms.ValidationError('duplicate email') 中使用了 ValidationError。如何在自定义表单中显示此错误?

您可以为 RegForm 中的 email 字段编写自定义清理器。类似于:

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

视图的逻辑似乎有问题。

评估表单时 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})

而且标签好像漏了一个开头<

    <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/')

回答我自己的问题。我是新手,因此花了很多时间和精力来解决这个问题。 在我看来,我只是错过了这一点:

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

因为,当表单无效时,我没有返回表单,视图为空,因此出现错误。