如何通过自定义验证覆盖django的URLField验证?这应该在哪里完成?
我希望它接受没有域名结尾的网址。
答案 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',
)])