【问题标题】:form.ValidationError is not showing in templateform.ValidationError 未显示在模板中
【发布时间】:2021-01-07 20:27:55
【问题描述】:

我是 Django 新手,请原谅一些错误。 我正在尝试为电子邮件创建验证系统并将这些错误(如果有)打印到模板中。 为了清楚起见,我能够创建新用户并重定向到登录页面,我只是无法显示错误消息。 如果这是一个微不足道的问题,我深表歉意,但我有点坚持了 2 天。 我在youtube 上尝试过这个视频:我尝试关注这个post,但没有成功。

forms.py

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

# This class will overwrite origginal UserCreationForm0
class CreateUserForm(UserCreationForm):
    email = forms.EmailField(required = True)
    class Meta:
        model = User
        # this will add email to our register_form
        fields = [
            'username',
            'email',
            'password1',
            'password2'
        ]
    def clean(self):
        cleaned_data = super(CreateUserForm, self).clean()
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise forms.ValidationError('User with same email already exists')
        return cleaned_data

views.py

from django.shortcuts import render, redirect
from .forms import CreateUserForm
from django.contrib.auth import login, authenticate, logout
from django.contrib.auth.forms import AuthenticationForm
from django.contrib import messages
# Create your views here.
def registration_page(request):
    if request.user.is_authenticated:
        return redirect('')
    else:
        form = CreateUserForm()
        if request.method == 'POST':
            form = CreateUserForm(request.POST)
            if form.is_valid():
                form.save()
                messages.success(request, 'User has been successefly registered, Please Log In!')
                return redirect('accounts:login')
        else:
            CreateUserForm()
        context = {
            'form': form
        }
        return render(request, 'accounts/register.html', context)

注册.html

<form class="form-horizontal" method="post">
                                  {% csrf_token %}
                                    <div class="form-group">
                                        <label for="email" class="cols-sm-2 control-label">Your Email</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                                                {{form.email}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="username" class="cols-sm-2 control-label">Username</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
                                                {{form.username}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="password" class="cols-sm-2 control-label">Password</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                                                {{form.password1}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                                                {{form.password2}}
                                            </div>
                                        </div>
                                    </div>
                                    <p>{{form.email.errors}}</p>
                                    <p>{{form.password.errors}}</p>
                                    <div class="form-group ">
                                        <input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
                                    </div>
                                    <div class="login-register">
                                        <a href="{% url 'accounts:login' %}">Login</a>
                                    </div>
                                </form>

【问题讨论】:

    标签: python django forms validationerror


    【解决方案1】:

    clean 方法引发的没有附加字段的错误被添加到.non_field_errors() [Django-doc]。因此,您应该使用:

    <p>{{ form.non_field_errors }}</p>
    <p>{{ form.username.errors }}</p>
    <p>{{ form.email.errors }}</p>
    <p>{{ form.password1.errors }}</p>
    <p>{{ form.password2.errors }}</p>

    话虽如此,(1)这个错误是特定于字段的,所以你最好在clean_email方法中清除它; (2) 如果 model 字段被标记为唯一,Django 模型表单可以检查唯一性。

    class CreateUserForm(UserCreationForm):
        email = forms.EmailField(required=True)
        
        class Meta:
            model = User
            fields = [
                'username',
                'email',
                'password1',
                'password2'
            ]
        
        def clean_email(self):
            email = self.cleaned_data['email']
            if User.objects.exclude(pk=self.instance.pk).filter(email=email).exists():
                raise forms.ValidationError('User with same email already exists')
            return email

    这里.exclude(…) 很有用,如果表单具有已保存在数据库中的包装实例。

    【讨论】:

    • 您好,感谢您的帮助。这解决了我的问题。 :)
    【解决方案2】:

    你可以添加这行

    <form class="form-horizontal" method="post">
                                  {% csrf_token %}
                                    <div class="form-group">
                                        <label for="email" class="cols-sm-2 control-label">Your Email</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-envelope fa" aria-hidden="true"></i></span>
                                                {{form.email}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="username" class="cols-sm-2 control-label">Username</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i></span>
                                                {{form.username}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="password" class="cols-sm-2 control-label">Password</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                                                {{form.password1}}
                                            </div>
                                        </div>
                                    </div>
                                    <div class="form-group">
                                        <label for="confirm" class="cols-sm-2 control-label">Confirm Password</label>
                                        <div class="cols-sm-10">
                                            <div class="input-group">
                                                <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                                                {{form.password2}}
                                            </div>
                                        </div>
                                    </div>
                                    <p>{{form.email.errors}}</p>
                                    <p>{{form.password2.errors}}</p>
                                    <p>{{form.username.errors}}</p>
                                    <div class="form-group ">
                                        <input type="submit" value="Register" class="btn btn-primary btn-lg btn-block login-button">
                                    </div>
                                    <div class="login-register">
                                        <a href="{% url 'accounts:login' %}">Login</a>
                                    </div>
                                </form>
    

    【讨论】:

    • 您好,感谢您的快速回复。这解决了我的密码错误和用户名未显示但未显示电子邮件的问题。感谢下面的帖子,我修改了清洁功能,现在可以使用了!感谢帮助! :)
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 2018-12-11
    • 2015-11-09
    • 2013-06-23
    • 2022-01-03
    • 2013-09-11
    • 1970-01-01
    相关资源
    最近更新 更多