es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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
Tags:  , , ,

Answer

  1. Avatar for 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 argumento unique=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ón AppRegistryNotReady.

    Para solucionar esto, puede agregar las siguientes líneas a su settings/base.py:

    WAGTAILIMAGES_IMAGE_MODEL = 'yourapp.CustomImage'
    WAGTAILIMAGES_IMAGE_FORM_BASE = 'yourapp.forms.CustomImageForm'
    

    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:

    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
    

    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.

Comments are closed.