Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在注册中验证电子邮件不会在Django中引发validationError?_Python_Django_Django Forms_Django Views_Django Registration - Fatal编程技术网

Python 在注册中验证电子邮件不会在Django中引发validationError?

Python 在注册中验证电子邮件不会在Django中引发validationError?,python,django,django-forms,django-views,django-registration,Python,Django,Django Forms,Django Views,Django Registration,在我的注册中,我强制要求电子邮件id是唯一的。也就是说,如果存在具有该电子邮件id的用户,我想引发aforms.ValidationError 这是我的表单.py: from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User class MyRegistrationForm(UserCreationForm): #define fields

在我的
注册
中,我强制要求
电子邮件id
是唯一的。也就是说,如果存在具有该电子邮件id的用户,我想
引发
a
forms.ValidationError

这是我的
表单.py

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

class MyRegistrationForm(UserCreationForm):
    #define fields
    email=forms.EmailField(required=True)

    class Meta:
        model=User
        fields=('username','email','password1','password2')

    def clean_email(self):
            email = self.cleaned_data["email"]
            try:
                user = User.objects.get(email=email)
                print user.email
                print user.username
                raise forms.ValidationError("This email address already exists. Did you forget your password?")
            except User.DoesNotExist:
                return email

    def save(self, commit=True):
            user = super(MyRegistrationForm, self).save(commit=False)
            user.email=self.cleaned_data["email"]
            if commit:
                user.save()
            return user
def register_user(request):
    if request.method=='POST':
        form=MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Thank you for signing up")
            return HttpResponseRedirect("/accounts/register_success")

    args={}
    args['form']=MyRegistrationForm()
    return render(request,"register.html",args)
我的
视图.py

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

class MyRegistrationForm(UserCreationForm):
    #define fields
    email=forms.EmailField(required=True)

    class Meta:
        model=User
        fields=('username','email','password1','password2')

    def clean_email(self):
            email = self.cleaned_data["email"]
            try:
                user = User.objects.get(email=email)
                print user.email
                print user.username
                raise forms.ValidationError("This email address already exists. Did you forget your password?")
            except User.DoesNotExist:
                return email

    def save(self, commit=True):
            user = super(MyRegistrationForm, self).save(commit=False)
            user.email=self.cleaned_data["email"]
            if commit:
                user.save()
            return user
def register_user(request):
    if request.method=='POST':
        form=MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Thank you for signing up")
            return HttpResponseRedirect("/accounts/register_success")

    args={}
    args['form']=MyRegistrationForm()
    return render(request,"register.html",args)
当我用相同的电子邮件id注册一个
用户时,它不会抛出
validationError
。但只需返回
register.html
,但不会添加重复用户

为什么它不抛出
validationError

我在
forms.py(上图)
中添加了两个
print
语句,用于
print
我从
User.object.get(email=email)
获得的
用户名
email id
中正确打印以前注册用户的
姓名
。因此,控件将继续运行到那里,但不会抛出
validationError

编辑:

我还尝试创建一个
全新的用户
,但是有
passoword
字段
不匹配
。 不过,我没有收到任何
错误
消息。但它只是重定向到
register.html

{% extends "base.html" %}

{% block content %}


<h2>Register</h2>
<form action="" method="post">{% csrf_token %}

{{ form.as_p }}

<input type="submit" value="register"/>

</form>
{% endblock %}
编辑:

template/register.html

{% extends "base.html" %}

{% block content %}


<h2>Register</h2>
<form action="" method="post">{% csrf_token %}

{{ form.as_p }}

<input type="submit" value="register"/>

</form>
{% endblock %}
{%extends“base.html”%}
{%block content%}
登记
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}

在此模板中,
错误
自动显示在发生
错误的
字段
的正上方。我不必做{{form.email.error}。但是,我没有办法自定义
错误
。例如
bold
或一些css。这可能吗?

Django表单捕获
验证错误
异常,并将错误添加到表单
\u错误
dict。此代码来自Django
基表单。\u清除字段
方法:

        try:
            # ...
            if hasattr(self, 'clean_%s' % name):
                value = getattr(self, 'clean_%s' % name)()
                self.cleaned_data[name] = value
        except ValidationError as e:
            self._errors[name] = self.error_class(e.messages)
            if name in self.cleaned_data:
                del self.cleaned_data[name]
所以,通过引发
ValidationError
exception,您告诉django在清理字段中添加错误,并使表单无效

您可以访问模板中的字段错误:

{{ form.field_name.errors }}
并迭代一个字段错误(django文档):

并显示非字段错误:

 {{ form.non_field_errors }}
更新:您应该在视图中添加
else
块。如果没有
else
,您将始终创建新表单:

def register_user(request):
    if request.method=='POST':
        form=MyRegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            messages.success(request, "Thank you for signing up")
            return HttpResponseRedirect("/accounts/register_success")
    else:
        form = MyRegistrationForm()

    args={}
    args['form'] = form
    return render(request,"register.html",args)

这闻起来像一个html模板,它不会在表单中显示错误。尝试在模板中添加
{{form.errors}}
,看看会发生什么。我将其添加到模板中仍然没有帮助需要什么修复?我不清楚你的回答,我尝试了
{{{form.email.errors}}
,但没有给出任何信息。
ValidationError
是否重定向到
寄存器
页面!这有帮助。默认情况下,用户模型允许唯一用户名。i、 如果我尝试注册一个新用户,使用相同的用户名,它将不会注册,但我想我们必须显式地签入模板,以抛出form.errors。但是
{{form.field\u name.errors}}
是一个列表还是一个错误,还是仅仅是一个字符串版本?@热切学习{{{form.field\u name.errors}}是可移植的,我添加了一个很有帮助的示例。如果我在所有字段中都有表单错误,我如何遍历所有错误。由于
field.email.error
field.username.error
特定于
电子邮件和用户名字段