如何将validate_email软件包包含到django UserCreationForm中?

时间:2019-09-17 02:14:49

标签: python django validation django-registration

我从PyPI下载了一个电子邮件验证程序包,链接为:https://pypi.org/project/validate_email/,并使用pip install验证电子邮件和pip install py3dns(因为我的python版本是3.6.7)到django项目中。问题是我似乎无法让validate_email函数在我的django项目上工作,只是想知道我应该在django的form.py和views.py上写什么代码。 (尚未使用models.py)。请告诉我我做错了什么,应该在forms.py中对当前代码进行哪些更改。

我在下面的forms.py中添加了“从django.core.validators导入validate_email”,以尝试验证任何用户输入的电子邮件,但似乎validate_email的工作方式与“ from validate_email import validate_email”的validate_email有所不同。我需要的验证来自PyPI,因为它可以更准确地进行验证(例如可以检查电子邮件是否存在),而validate_email表单django.validators仅检查无效格式,就是这样。

/* forms.py */
from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm
from django.core.validators import validate_email
from validate_email import validate_email


class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()
    phone_number = forms.IntegerField(required=True)

    class Meta:
        model = User
        fields = ['username', 'email']

    def clean_email(self):
        email_passed = self.cleaned_data.get("email")
        email_req = "yourdomain.com"
        if not email_req in email_passed:
            raise forms.ValidationError("Invalid email format")
        return email

/* views.py */

from django.shortcuts import render, redirect
from django.contrib import messages
from .forms import UserRegisterForm


def register(request):
    if request.method == 'POST':
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            phone_number = form.cleaned_data['phone']
            # do something with phone number??
            username = form.cleaned_data.get('username')
            messages.success(request, f'Account created for {username}!')
            return redirect('blog-home')
    else:
        form = UserRegisterForm()
    return render(request, 'users/register.html', {'form': form})

我希望输出通过使用get方法获取电子邮件并使用validate_email进行验证来验证django表单的email字段中的电子邮件。 例如,如果输入的电子邮件是“ ifewheieuiower34@gmail.com”(这是不存在的电子邮件),则该表单将引发错误,指出该电子邮件不存在。

1 个答案:

答案 0 :(得分:0)

您不会在clean方法中从包中调用validate_email函数。您可以像这样在clean_email方法中调用它

def clean_email(self):
    email = self.cleaned_data.get("email")
    if not validate_email(email):
        raise forms.ValidationError("Invalid email")
    return email