Python Django Forms.py电子邮件和电话验证

Python Django Forms.py电子邮件和电话验证,python,django,validation,contact-form,Python,Django,Validation,Contact Form,我有一个使用forms.py创建的联系人表单,我希望使用正则表达式或任何内置的Django验证器为电子邮件和电话字段添加验证。我使用的唯一文件是forms.py、views.py和html模板(此联系人表单没有models.py)。如果用户输入了错误的电话号码或电子邮件,我想向他们显示一条消息,告诉他们格式不正确,他们需要更正输入。在用户输入有效数据之前,应无法提交表单 现在,在表单中输入假数据,然后提交会导致表单不做任何事情(它会在url中转到#),但用户不知道电子邮件是否已发送 以下是我的尝

我有一个使用forms.py创建的联系人表单,我希望使用正则表达式或任何内置的Django验证器为电子邮件和电话字段添加验证。我使用的唯一文件是forms.py、views.py和html模板(此联系人表单没有models.py)。如果用户输入了错误的电话号码或电子邮件,我想向他们显示一条消息,告诉他们格式不正确,他们需要更正输入。在用户输入有效数据之前,应无法提交表单

现在,在表单中输入假数据,然后提交会导致表单不做任何事情(它会在url中转到#),但用户不知道电子邮件是否已发送

以下是我的尝试:

Forms.py: 来自django导入表单的

从django.core.validators导入EmailValidator
从django.core.exceptions导入ValidationError
从django.core.validators导入validate\u电子邮件
​
班级联络表(forms.Form):
contact_name=forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','autocomplete':'off'),required=True)
contact_email=forms.EmailField(错误_messages={'invalid':'This is my email error msg.},widget=forms.TextInput(attrs={'class':'form-control','autocomplete':'off',required=True)
contact_subject=forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','autocomplete':'off'),required=True)
contact_phone=forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','autocomplete':'off'),required=True)
content=forms.CharField(
必需=真,
widget=forms.Textarea(attrs={'class':'form-control','autocomplete':'off'})
)
​
#我们正在添加的新位
定义初始化(self,*args,**kwargs):
超级(ContactForm,self)。\uuuuuuuuuuuuuuuuuuu初始(*参数,**kwargs)
self.fields['contact_name'].label=“全名:”
self.fields['contact_email'].label=“email:”
self.fields['contact_subject'].label=“subject:”
self.fields['contact_phone'].label=“phone:”
self.fields['content'].label=“消息:”
​
def clean_电子邮件(自我):
电子邮件=自我清理的数据['contact\u email']
validator=RegexValidator(“^[a-zA-Z0-9.!$%&'*+/=?^ `{124}-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])*)
验证器(电子邮件)
返回电子邮件
Views.py:
def联系人(请求):
form_class=ContactForm
​
#新逻辑!
如果request.method==“POST”:
表单=表单_类(数据=request.POST)
​
如果form.is_有效():
​
recaptcha_response=request.POST.get('g-recaptcha-response')
url='1〕https://www.google.com/recaptcha/api/siteverify'
有效载荷={
“secret”:settings.GOOGLE\u RECAPTCHA\u secret\u密钥,
“响应”:重述cha_响应
}
data=urllib.parse.urlencode(有效负载).encode()
请求(url,数据=数据)
response=urllib.request.urlopen(req)
result=json.load(response.read().decode())
打印('结果:'+str(结果))
​
打印('recaptcha_响应:'+str(recaptcha_响应))
​
打印('result_success:'+str(result['success']))
​
​
如果(非结果['success'])或(非结果['action']=='contact'):
messages.error(请求“无效的reCAPTCHA。请重试”。)
​
联系人_name=request.POST.get(
“联系人姓名”
, '')
contact_subject=request.POST.get(
“联系受试者”
, '')
contact_email=request.POST.get(
“联系您的电子邮件”
, '')
联系电话=request.POST.get(
“联系电话”
, '')
form_content=request.POST.get('content','')
​
#通过电子邮件发送配置文件,并附上
#联系方式
template=get_template('contact_template.txt'))
上下文={
“联系人姓名”:联系人姓名,
“联系人电子邮件”:联系人电子邮件,
“联系人主题”:联系人主题,
“联系人电话”:联系人电话,
“表单内容”:表单内容,
}
content=template.render(上下文)
​
email=EmailMessage(
联系受试者,
内容,,
“您的网站”+“”,
['email@gmail.com'],
headers={'Reply-To':联系人\电子邮件}
)
email.send()
messages.info(请求“您的邮件已成功发送。感谢您的联系。”)
​
返回呈现(请求“contact.html”{
“form”:form_类,
})
Html模板:

{%csrf_令牌%}
{{form.as_p}}
grecaptcha.ready(函数(){
执行(“”,{action:'contact'})
.then(功能(令牌){
ginput=document.createElement('input');
ginput.type=“隐藏”;
ginput.name=“g-recaptcha-response”;
ginput.value=令牌;
document.getElementById(“cform”).appendChild(ginput);
});
});
提交

如何仅使用Django而不使用JavaScript来执行此操作?

您可以使用
EmailValidator
而不是
RegexValidator
。这样,您就不需要编写能够可靠地测试电子邮件地址的正则表达式(这很难做到)

为了验证电话号码,我会使用电话号码库

更新

Djano表单文档非常好。答案在这里

我会给你一些建议

使用基于类的视图处理表单的示例是联系人表单

这是指
class ContactForm(forms.Form):
    contact_email = forms.EmailField()
from django.core.exceptions import ValidationError
import phonenumbers

def validate_phone_number(value):
    z = phonenumbers.parse(value, None)
    if not phonenumbers.is_valid_number(z):
        raise ValidationError(
            _('%(value) is not a valid phone number'),
            params={'value': value},
        )
contact_phone = models.CharField(validators=[validate_phone_number])