微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

form.ValidationError未显示在模板中

如何解决form.ValidationError未显示在模板中

我是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)

register.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>

解决方法

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(…)很有用。

,

您可以添加此行

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?