You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何覆盖Wagtail StructBlock中URLBlock的默认验证器

问题原因

Wagtail 的 URLBlock 默认自带 Django 原生的 URLValidator 验证规则,你传入 validators 参数时,默认是追加自定义验证器到原有验证器列表,而非替换原有验证器。Django 原生的 URL 验证规则要求域名必须包含.,因此不带点的内网域名intranet无法通过默认验证,才会出现你遇到的报错。


解决方法

方法1:改用CharBlock自定义URL验证(最简单)

直接放弃使用自带默认验证的URLBlock,换成CharBlock,仅保留你自定义的正则验证规则即可,代码修改如下:

from django.core.validators import RegexValidator
from wagtail import blocks

URL_VALIDATOR_MESSAGE = 'Not a valid URL'
# 正则前加r标记为raw字符串,避免转义异常
URL_VALIDATOR = RegexValidator(regex=r'http\D+', message=URL_VALIDATOR_MESSAGE)

class SezPubBlock(blocks.StructBlock):
    sez = blocks.ListBlock(
      blocks.StructBlock(
        [
            ("title", blocks.CharBlock(classname="full title", icon="title", required=True)),
            # 替换为CharBlock,无默认URL验证,仅走自定义规则
            ("url", blocks.CharBlock(required=True, validators=[URL_VALIDATOR])),
        ], label="Link", icon="link"
      ), label="Link sezione"
    )

方法2:自定义URLBlock子类,替换默认验证器

如果你需要保留URLBlock的其他特性(比如前端输入的URL格式提示),可以继承URLBlock重写默认验证器列表:

from django.core.validators import RegexValidator
from wagtail import blocks

URL_VALIDATOR_MESSAGE = 'Not a valid URL'
URL_VALIDATOR = RegexValidator(regex=r'http\D+', message=URL_VALIDATOR_MESSAGE)

# 自定义URLBlock子类,覆盖原有默认验证器
class CustomURLBlock(blocks.URLBlock):
    default_validators = [URL_VALIDATOR]

class SezPubBlock(blocks.StructBlock):
    sez = blocks.ListBlock(
      blocks.StructBlock(
        [
            ("title", blocks.CharBlock(classname="full title", icon="title", required=True)),
            # 使用自定义的URLBlock,无默认域名带点校验规则
            ("url", CustomURLBlock(required=True)),
        ], label="Link", icon="link"
      ), label="Link sezione"
    )

内容的提问来源于stack exchange,提问作者nickb84

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:45:06