Django-super(ModelForm,self).clean()而不引发ValidationError

时间:2018-07-19 16:26:35

标签: django forms

我正在尝试在验证中实施特殊技巧。我希望程序仅在两个字段均无效时才引发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>

1 个答案:

答案 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