我正在尝试在验证中实施特殊技巧。我希望程序仅在两个字段均无效时才引发ValidationError。一个是电子邮件字段,因此是模型中的emailField。另一个是电话号码,是模型中的CharField。
models.py
...
email = models.EmailField(max_length=128, blank=True, null=True)
telephone = models.CharField(max_length=32, blank=True, null=True)
...
在forms.py中,我正在使用内置的clean来处理电子邮件,并使用自定义的来处理电话号码。
forms.py
def clean(self):
cleaned_data=super(ContactInstructorForm, self).clean()
try:
email = self.cleaned_data['email']
except:
email = False
telephone = self.cleaned_data['telephone']
mobile_regex = r'^(\+46|0|\(\+46\)) *(7[0236])( |-|)(\d{4} \d{3}|\d{3} \d{4}|\d{3} \d{2} \d{2}|\d{2} \d{2} \d{3}|\d{7})$'
home_phone_regex = r'^(\+46|0|\(\+46\)) *(8)( |-|)(\d{4} \d{2}|\d{2} \d{4}|\d{3} \d{3}|\d{2} \d{2} \d{2}|\d{6})$'
if not re.match(mobile_regex, telephone) and not re.match(home_phone_regex, telephone):
telephone = False
if not email and not telephone:
raise ValidationError()
但是,问题在于内置的clean()方法不仅返回了所有已验证字段及其值的字典。但是一旦失败,也会自动引发ValidationError。
这将导致我的程序在仅输入的电子邮件无效(即使电话号码正确)时失败。 此行为是不必要的!
因此,最终我要问如何围绕电子邮件的内置验证(最好是在电话号码有效时)建立最好的方法,但是同时要使用内置验证(尤其是当电话号码为无效)和其他所有字段。
更新: 我还使用来自“ djangospam”模块的自动蜜罐。它包含在模板中,就在表单之前。
{% include 'djangospam/form.html' %}
将其翻译成HTML:
<form method="post" action="http://www.somewebsite.com">
<label for="honeypot">Honeypot</label>
<input id="honeypot" type="text" name="honeypot"></input>
<label for="name">Name</label>
<input id="name" type="text" name="name"></input>
<label for="email">E-mail</label>
<input id="email" type="text" name="email"></input>
<label for="url">Website (optional)</label>
<input id="url" type="text" name="url"></input>
<label for="comment">Your comment</label>
<textarea id="comment" name="comment"></textarea>
<input type='hidden' name='csrfmiddlewaretoken' value='8Nwq32Mbh6KA1h3C1U4ZMRe2nTkUGSbebVgsQbF8zZL2dKoZAS4kjoQM8W1NEb3g' />
<input type="submit" value="Send"></input>
</form>
答案 0 :(得分:0)
您的电子邮件始终设置为email = self.cleaned_data['email']
,也就是始终为True
。它永远不会碰到except块。加上最后一个条件,将其设置为引发Validation error
。像使用电话一样放置电子邮件正则表达式,应该没问题。
编辑:-类似这样的东西
email = self.cleaned_data['email']
telephone = self.cleaned_data['telephone']
email_regex--- your email_regex/validation here