使用自定义验证覆盖URLField的验证

时间:2014-03-12 10:29:26

标签: python regex django

如何通过自定义验证覆盖django的URLField验证?这应该在哪里完成?

我希望它接受没有域名结尾的网址。

3 个答案:

答案 0 :(得分:2)

这是Django的Url Field Validator。提供自定义正则表达式myregex。但是,您需要阻止UrlField默认验证,因为这不是您想要的。

所以创建你的自定义字段: 然后对于您的模型/表单,将其提供给字段:

from django.forms import UrlField as DefaultUrlField
class UrlField(DefaultUrlField):
    default_validators = [URLValidator(regex=myregex)]

然后在你的表格中做:

my_url_field = UrlField()

答案 1 :(得分:0)

如何将CharField(URLField的超类)与您自己的验证器一起使用

如果有帮助,请参见this example。谢谢!

答案 2 :(得分:0)

您可以创建自定义正则表达式验证,也可以在模型上使用Django URL验证:

选项1:

from django.core.validators import RegexValidator
URL_VALIDATOR_MESSAGE = 'Not a valid URL.'
URL_VALIDATOR = RegexValidator(regex='/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/', message=URL_VALIDATOR_MESSAGE)


class SocialAccounts(models.Model):
    user = models.ForeignKey("Profile", on_delete=models.CASCADE, blank=True, null=True, unique=True)
    facebook = models.URLField(max_length=200, null=True, blank=True, validators=[URL_VALIDATOR])

选项2:

from django.core.validators import URLValidator
class OptionalSchemeURLValidator(URLValidator):
    def __call__(self, value):
        if '://' not in value:
            # Validate as if it were http://
            value = 'http://' + value
        super(OptionalSchemeURLValidator, self).__call__(value)


class SocialAccounts(models.Model):
    user = models.ForeignKey("Profile", on_delete=models.CASCADE, blank=True, null=True, unique=True)
    facebook = models.URLField(max_length=200, null=True, blank=True, validators=[OptionalSchemeURLValidator])
    instagram = models.URLField(max_length=200, null=True, blank=True,
                                validators=
                                    [RegexValidator(
                                        regex= '/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/',
                                        message='Not a valid URL',
                                    )])