Ho un modello, OrderedList, che è destinato a essere un elenco di oggetti di contenuto ordinati dall'utente. OrderedList ha diversi attributi, incluso un sito a cui appartiene.Convalida modulo in amministrazione con formset in linea e modulo modello
Gli oggetti del contenuto sono collegati ad esso tramite una classe OrderedListRow, che viene portata nell'amministrazione di OrderedList tramite un formset incorporato nell'admin.
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 eredita il campo sito dal astratto grande GenericList).
Ecco il mio problema; quando l'utente salva il modulo di amministrazione, voglio verificare che ogni oggetto di contenuto mappato da ogni OrderedListRow appartenga allo stesso sito di OrderedList (l'elenco può appartenere solo a 1 sito, gli oggetti di contenuto possono appartenere a più).
È possibile sovrascrivere clean() del modulo di amministrazione di OrderedList, ma non include il formset inline che contiene OrderedListRows, quindi non può raggiungere tali dati. Posso ignorare il formline inline di OrderedListRows pulito, ma non può raggiungere l'elenco. Ho bisogno di un qualche modo nel contesto della validazione del modulo per raggiungere sia i dati del modulo OrderedList che i dati del modulo del formset in modo da poter controllare tutti i siti degli oggetti del contenuto di OrderedListRow sul sito di OrderedList e lanciare un errore di convalida se c'è un problema . Finora non ho trovato una funzione in cui sono contenuti i dati puliti per OrderedRow e OrderedListRows.
Alla fine, ho creato un formset per OrderedListRow inline e ho eseguito un override della sua funzione clean(). In esso, è stato possibile richiamare l'ID del sito chiamando site_id = self.data.get ('sito') Con "sito" il nome del campo del sito utilizzato dal genitore OrderedList. In sostanza, sto accedendo direttamente dai dati del modulo. Una volta ricevuto l'ID del sito inviato, potrei scorrere tutte le forme del formset OrderedListRow e confrontare il sito del loro contenuto con il sito OrderedList. – KRH