我需要向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中的图像不使用WagtailAdminModelForm
或base_form_class
属性-页面、代码段和ModelAdmin使用这些属性来支持Wagtail特定的功能,如内联子项和面板,但图像通过普通的Django模型和表单工作。
您可以通过子类化BaseImageForm并在项目设置中设置WAGTAILIMAGES_IMAGE_form_BASE来自定义表单。只要你在models.py之外的某个地方定义你的表单类(例如在一个单独的forms.py模块中(,你就会避免导致";模型尚未加载";错误