Wagtail CMS自定义图片模型的管理表单如何定制以实现唯一ID校验
Wagtail 自定义图片模型唯一ID校验问题
问题描述
需要给Wagtail的图片模型添加字符串类型的唯一ID,该ID为由字母、数字和标点组成的短字符串,例如AS.M-1.001。通过自定义图片模型,使用Django标准CharField添加了带unique=True参数的对应字段,但编辑表单不会校验ID的唯一性,同一ID可被多张图片使用。该唯一性校验在Wagtail其他标准表单(例如Page模型)中可正常生效,仅图片模型不生效。
原始自定义图片模型代码:
from django.db import models from wagtail.images.models import Image, AbstractImage class CustomImage(AbstractImage): custom_id = models.CharField(max_length=32, unique=True, null=True, blank=True) admin_form_fields = ( 'custom_id', ) + Image.admin_form_fields
最初尝试效仿Wagtail的Page模型通过base_form_class覆写编辑表单,新增提示和错误校验,先后尝试继承wagtail.admin.forms.WagtailAdminModelForm和wagtail.images.forms.BaseImageForm定义自定义表单:
from wagtail.images.forms import BaseImageForm from wagtail.admin.forms import WagtailAdminModelForm class CustomImageForm(WagtailAdminModelForm): # 此处可新增自定义逻辑 pass class CustomImage(ArtButlerIDMixin, AbstractImage): ... base_form_class = CustomImageForm
两种写法均抛出相同异常:
raise AppRegistryNotReady("Models aren't loaded yet.")
调整settings中应用的加载顺序后仍无效果,因此需确认Wagtail覆写管理表单的标准方案是否适用于图片模型,以及是否有其他方案可实现唯一字符串ID校验或自定义该表单。
解决方案
按照社区建议操作如下:
- 在
settings/base.py中新增如下配置:
WAGTAILIMAGES_IMAGE_MODEL = 'images.CustomImage' WAGTAILIMAGES_IMAGE_FORM_BASE = 'images.forms.CustomImageForm' # 新增配置项
- 在图片应用的
forms.py中定义自定义表单:
from django.core.exceptions import ValidationError from wagtail.images.forms import BaseImageForm from .models import CustomImage class CustomImageForm(BaseImageForm): def clean(self): cleaned_data = super().clean() custom_id = cleaned_data.get("custom_id") if CustomImage.objects.filter(custom_id=custom_id).exists(): raise ValidationError( "Custom ID already exists" ) return cleaned_data
内容的提问来源于stack exchange,提问作者Fuchsi
相关产品推荐
相关产品推荐

