首页 > 解决方案 > Django - 调用 .super().clean() 后未列出电子邮件字段

问题描述

我是 Django 新手,如果这是基本问题(或错误),我深表歉意,但是当电子邮件输入如下:test@com时,我遇到了电子邮件格式验证问题。

我在下面创建了 form.py 和 views.py 进行测试:

表格.py

from django import forms
from django.core import validators

class userForm(forms.Form):
    fname = forms.CharField(label="First name")
    lname = forms.CharField(label="Last name")
    email = forms.EmailField(label="Email")
    vemail = forms.EmailField(label="Email validation")


    def clean(self):
        all_clean_data = super().clean()
        fname = all_clean_data['fname'].lower().capitalize()
        lname = all_clean_data['lname'].lower().capitalize()
        email = all_clean_data['email'].lower()
        vmail = all_clean_data['vemail'].lower()
        if email != vmail:
            raise forms.ValidationError("Email address doesn't match, please try again")

视图.py

def users(request):
    form = forms.userForm()
    if request.method == 'POST':
        form = forms.userForm(request.POST)
        if form.is_valid():
            print('Validation ok')
    return render(request,"test_app/users.html",{'formName':form})

似乎一切正常......但是......如果在表单(网页)中输入电子邮件地址,例如:test@com并提交表单,会发生两件事:

  1. 我没有在表单(网页)上收到类似“无效的电子邮件格式”的警报
  2. all_clean_data['email'] 上的电子邮件“密钥”不存在。

如果我输入一个有效的电子邮件,例如:test@test.com,它就可以工作。如果我输入了一个无效的电子邮件地址,例如:abcde,那么我会收到一条警报消息。

问题是当我输入以下内容时:test@com ...然后我没有收到任何验证错误消息,提交被触发但我也没有得到该字段。

感谢你的帮助。

在调试信息下方

KeyError at /
'email'
Request Method:     POST
Request URL:    http://127.0.0.1:8000/
Django Version:     3.0.3
Exception Type:     KeyError
Exception Value:    
'email'
Exception Location:     /Users/.../test_app/forms.py in clean, line 20
Python Executable:  /Users/.../bin/python
Python Version:     3.8.2
Python Path:    
['/Users/.../test_project/test_project',
 '/Users/.../opt/anaconda3/envs/myDjangoEnv/lib/python38.zip',
 '/Users/.../opt/anaconda3/envs/myDjangoEnv/lib/python3.8',
 '/Users/.../opt/anaconda3/envs/myDjangoEnv/lib/python3.8/lib-dynload',
 '/Users/.../opt/anaconda3/envs/myDjangoEnv/lib/python3.8/site-packages']

标签: pythondjangovalidationemail-validation

解决方案


推荐阅读