#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. Спасибо! Это отлично работает! Я обновлю свой вопрос, чтобы помочь другим, ищущим этот ответ.