问题描述
我正在使用子类的Django URLField对单击的URL进行一些验证。我将mailto添加为受支持的URLValidator default_validators之一:
class MyURLField(forms.URLField):
default_validators = [
validators.URLValidator(
schemes=['http','https','ftp','ftps','mailto']
)
]
class MyForm(forms.Form):
url = MyURLField(required=True)
form = MyForm({'url': 'mailto:[email protected]'})
if not form.is_valid():
raise Exception()
clean_url = form.cleaned_data['url']
print(clean_url) # this prints 'mailto://[email protected]'
mailto
网址是否仍然有效,并且带有两个额外的协议斜杠?
mailto:[email protected]
与mailto://[email protected]
(Django产生的结果)
解决方法
Django有一个EmailField
,因此,如果您想存储电子邮件地址,或什至以表格形式使用它们,请使用这些字段,因为您可以获得内置的验证,而不必像其他人一样入侵将与您的方法有关。
在模型中,您会做的
class MyModel(models.Model):
email = models.EmailField(
verbose_name=_('Email'),max_length=255,unique=True,db_index=True
)
在您的表单中非常相似;
class MyForm(forms.ModelForm):
email = forms.EmailField(
label=_("Email")
)
然后,当您将其输出到模板等中时,它将变成一个mailto
URL;
<a href="mailto:{{ object.email }}">
{{ object.email }}
</a>