如何在Wagtail CMS中为自定义图像模型自定义管理表单



我需要向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):
# add more logic here
pass
class CustomImage(ArtButlerIDMixin, AbstractImage):
...
base_form_class = CustomImageForm

两者都导致了相同的异常:

raise AppRegistryNotReady("Models aren't loaded yet.")

因此,a试图在我的设置中使用这些应用程序,但没有效果。如何在Wagtail中覆盖管理表单的标准方法对图像模型有效吗?还有什么其他方法可以在这里获得唯一的字符串标识符。。。或自定义此表单。

解决方案(更新(

根据@gasman的建议,我在settings/base.py:中添加了以下行

WAGTAILIMAGES_IMAGE_MODEL = 'images.CustomImage'
WAGTAILIMAGES_IMAGE_FORM_BASE = 'images.forms.CustomImageForm'  # NEW

并在我的图像应用程序中的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

Wagtail中的图像不使用WagtailAdminModelFormbase_form_class属性-页面、代码段和ModelAdmin使用这些属性来支持Wagtail特定的功能,如内联子项和面板,但图像通过普通的Django模型和表单工作。

您可以通过子类化BaseImageForm并在项目设置中设置WAGTAILIMAGES_IMAGE_form_BASE来自定义表单。只要你在models.py之外的某个地方定义你的表单类(例如在一个单独的forms.py模块中(,你就会避免导致";模型尚未加载";错误

最新更新