带有斜杠的mailto URL仍然有效吗?

问题描述

我正在使用子类的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>