2009-06-08 6 views
5

Tengo un modelo, OrderedList, que pretende ser una lista de objetos de contenido ordenados por el usuario. OrderedList tiene varios atributos, incluido un sitio al que pertenece.Validación de formulario en administración con formset en línea y formulario de modelo

Los objetos de contenido se adjuntan mediante una clase OrderedListRow, que se lleva al administrador de OrderedList a través de un formset en línea en el administrador.

class OrderedList(GenericList): 

    objects = models.Manager() 
    published = GenericListManager() 

class OrderedListRow(models.Model): 

    list = models.ForeignKey(OrderedList) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveSmallIntegerField() 
    content_object = generic.GenericForeignKey("content_type", "object_id") 
    order = models.IntegerField('order', blank = True, null = True) 

(OrderedList hereda el campo de sitio del resumen de GenericList más grande).

Aquí está mi problema; cuando el usuario guarda el formulario de administrador, quiero verificar que cada objeto de contenido asignado por cada OrderedListRow pertenece al mismo sitio que OrderedList (la lista solo puede pertenecer a 1 sitio, los objetos de contenido pueden pertenecer a múltiples).

Puedo anular la limpieza del formulario de administración de OrderedList(), pero no incluye el formset en línea que contiene OrderedListRows, por lo que no puede llegar a esos datos. Puedo anular la configuración del formset alineado de OrderedListRows, pero no puede llegar a la lista. Necesito algo en el contexto de la validación de formularios para alcanzar tanto los datos del formulario de OrderedList como los datos del formulario del formset para poder verificar todos los sitios de los objetos de contenido de OrderedListRow en el sitio de OrderedList y arrojar un error de validación si hay un problema . Hasta ahora no he encontrado una función que contenga los datos limpios tanto para OrderedRow como para OrderedListRows.

Respuesta

5

En el formset en línea, self.instance debe hacer referencia al objeto principal, es decir, la Lista ordenada.

1

Estoy lidiando con el mismo problema. Y, lamentablemente, no creo que la respuesta anterior cubra las cosas por completo.

Si hay cambios tanto en el formset en línea como en el formulario de administrador, acceder a self.instance no proporcionará datos precisos, ya que basará la validación en la base de datos y luego guardará el formset que sobrescribe los datos que acaba de usar validar cosas Básicamente esto hace que tu validación sea una excepción.

Supongo que la verdadera pregunta aquí es qué se guarda primero. Después de cavar en el código fuente, parece que el sitio de administración guardó primero el formulario. Esto significa que, lógicamente, al hacer la validación en el formset y desde allí acceder a la instancia 'principal' , debe obtener valores consistentes.

+0

Al final, creé un formset para el OrderedListRow en línea e hice una anulación de su función clean(). En él, pude extraer la identificación del sitio diciendo site_id = self.data.get ('site') Con 'site' es el nombre del campo de sitio que usa el padre OrderedList. Esencialmente, estoy accediendo directamente desde los datos del formulario. Una vez que obtuve el ID de sitio que se envió, pude recorrer todos los formularios del conjunto de formularios OrderedListRow y comparar el sitio de sus contenidos con el sitio de OrderedList. – KRH

Cuestiones relacionadas