【问题标题】:How to customize the admin form for a custom image model in Wagtail CMS?如何在 Wagtail CMS 中为自定义图像模型自定义管理表单?
【发布时间】:2021-12-02 13:49:14
【问题描述】:

我需要向 Wagtail 的 图像模型 添加一个基于字符串的唯一 ID。这些 ID 是字母、数字和标点符号的相对较短的组合,例如“AS.M-1.001”。所以我使用 custom image model 和 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 模型等 as documented here 使用 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.")

因此,我尝试在我的设置中使用这些应用,但没有任何效果。如何在 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

【问题讨论】:

    标签: python django wagtail wagtail-admin


    【解决方案1】:

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

    您可以通过继承 BaseImageForm 并在项目设置中设置 WAGTAILIMAGES_IMAGE_FORM_BASE 来自定义表单。只要您在 models.py 之外的某个地方定义表单类(例如,在单独的 forms.py 模块中),您就可以避免导致“模型尚未加载”错误的循环依赖。

    【讨论】:

    • 谢谢!这很好用!我会更新我的问题以帮助其他人寻找这个答案。
    猜你喜欢
    • 2015-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多