Как настроить форму администратора для пользовательской модели изображения в Wagtail CMS?

#python #django #wagtail #wagtail-admin

#python #django #wagtail #wagtail-администратор

Вопрос:

Мне нужно добавить уникальный идентификатор на основе строки в модель изображения Wagtail. Эти идентификаторы представляют собой относительно короткую комбинацию букв, цифр и знаков препинания, например «AS.M-1.001». Итак, я использую пользовательскую модель изображения со стандартом Django CharField для этого с аргументом unique=True . Но форма редактирования, к сожалению, не проверяет, является ли идентификатор уникальным. Таким образом, я могу использовать один и тот же идентификатор для нескольких изображений. Эта проверка уникальности работает в любой другой стандартной форме в 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
 

Мой подход заключался бы в том, чтобы переопределить форму редактирования пользовательской, чтобы отображать больше предупреждений и ошибок, как вы можете сделать с base_form_class Page моделью Wagtail и т. Д., Как описано здесь . Я попробовал оба 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 в приложение my images:

 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
 

Ответ №1:

Изображения в Wagtail не используют WagtailAdminModelForm base_form_class атрибут or — они используются страницами, фрагментами и администратором модели для поддержки специфичных для Wagtail функций, таких как встроенные дочерние элементы и панели, но изображения работают через простые модели и формы Django.

Вы можете настроить форму, создав подкласс BaseImageForm и установив WAGTAILIMAGES_IMAGE_FORM_BASE в настройках вашего проекта. Пока вы определяете свой класс формы где-то за пределами models.py (например, в отдельном forms.py модуль), вы избежите циклической зависимости, которая приводит к ошибке «Модели еще не загружены».

Комментарии:

1. Спасибо! Это отлично работает! Я обновлю свой вопрос, чтобы помочь другим, ищущим этот ответ.