¿Cómo personalizar el formulario de administración para un modelo de imagen personalizado en Wagtail CMS?
Necesito agregar un ID único basado en una cadena al modelo de imagen de Wagtail. Estos IDs son una combinación relativamente corta de letras, números y puntuación, como por ejemplo “AS.M-1.001”. Por lo tanto, estoy usando un modelo de imagen personalizado con el CharField
estándar de Django para eso con el argumento unique=True
. Pero desafortunadamente el formulario de edición no comprueba si el ID es único. Entonces puedo usar el mismo ID para varias imágenes. Esta comprobación de unicidad funciona en cualquier otro formulario estándar en Wagtail, por ejemplo, en el modelo de página. Pero no para el modelo de imagen.
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
Mi enfoque sería reemplazar el formulario de edición con uno personalizado para mostrar más advertencias y errores, como se puede hacer con base_form_class
para el modelo de Página
de Wagtail, etc., como se documenta aquí. Intenté tanto wagtail.admin.forms.WagtailAdminModelForm como wagtail.images.forms.BaseImageForm.
from wagtail.images.forms import BaseImageForm
from wagtail.admin.forms import WagtailAdminModelForm
class CustomImageForm(WagtailAdminModelForm):
# agregar más lógica aquí
pass
class CustomImage(ArtButlerIDMixin, AbstractImage):
...
base_form_class = CustomImageForm
Ambos conducen a la misma excepción:
raise AppRegistryNotReady("Models aren't loaded yet.")
Así que intenté reorganizar las aplicaciones en mi configuración sin efecto. ¿El enfoque estándar para reemplazar un formulario de administración en Wagtail funciona para el modelo de imagen en absoluto? ¿Qué podrían ser otras formas de hacer que un identificador de cadena único funcione aquí? … o para personalizar este formulario.
Solución (actualización)
Siguiendo el consejo de @gasman, agregué la siguiente línea a mi archivo settings/base.py:
WAGTAILIMAGES_IMAGE_MODEL = 'images.CustomImage'
WAGTAILIMAGES_IMAGE_FORM_BASE = 'images.forms.CustomImageForm' # NEW
Y agregué el siguiente formulario a un forms.py
en mi aplicación de imágenes:
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(
"El ID personalizado ya existe"
)
return cleaned_data
davy.ai
Para agregar un ID único basado en una cadena al modelo de imagen de Wagtail, puede crear un modelo de imagen personalizado en Django y usar
CharField
con el argumentounique=True
para almacenar el ID. Sin embargo, el formulario de edición no verifica si el ID es único, por lo que necesita anular el formulario para mostrar advertencias y errores.Puede hacer esto creando un formulario personalizado para el modelo de imagen y estableciendo el atributo
base_form_class
del modelo de imagen personalizado en su formulario. Sin embargo, al intentar hacer esto, es posible que encuentre una excepciónAppRegistryNotReady
.Para solucionar esto, puede agregar las siguientes líneas a su
settings/base.py
:Esto indica a Wagtail que use su modelo de imagen y formulario personalizados para el modelo de imagen.
En su formulario personalizado, puede agregar código de validación personalizado para verificar si el ID es único. Por ejemplo:
Este código verifica si ya existe una imagen con el mismo ID y genera un error de validación si es así.
Con estos cambios, debería poder agregar un ID único al modelo de imagen de Wagtail y asegurarse de que el formulario de edición verifique la unicidad.