2009-06-08 5 views
5

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.

risposta

5

Nel formato in linea, self.instance deve fare riferimento all'oggetto padre, ad esempio OrderedList.

1

Mi sto occupando dello stesso problema. E sfortunatamente non penso che la risposta di cui sopra riguardi interamente le cose.

Se sono presenti modifiche sia nel modulo di moduli in linea che nel modulo di amministrazione, l'accesso a self.instance non fornirà dati precisi, poiché baserai la convalida sul database e quindi salverai il formset che sovrascrive i dati che hai appena usato convalidare le cose. Fondamentalmente questo rende la tua convalida un salvataggio indietro.

Suppongo che la vera domanda qui sia quella che prima viene salvata. Dopo aver scavato il codice sorgente, sembra che il sito admin abbia prima salvato il modulo. Ciò significa che, logicamente, fare la convalida sul formset e da lì l'accesso all'istanza "genitore" dovrebbe ottenere valori coerenti.

+0

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