2009-06-08 5 views
5

J'ai un modèle, OrderedList, qui est destiné à être une liste d'objets de contenu classés par l'utilisateur. The OrderedList a plusieurs attributs, y compris un site auquel il appartient.Validation de formulaire dans Admin avec formset en ligne et formulaire modèle

Les objets de contenu y sont attachés via une classe OrderedListRow, qui est introduite dans l'admin de OrderedList via un formset inline dans l'admin. (OrderedList hérite du champ de site du résumé GenericList plus grand).

Voici mon problème; Lorsque l'utilisateur enregistre le formulaire d'administration, je veux vérifier que chaque objet de contenu mappé par chaque OrderedListRow appartient au même site que le OrderedList (la liste ne peut appartenir qu'à un seul site, les objets de contenu peuvent appartenir à plusieurs).

Je peux redéfinir clean() du formulaire d'administration de OrderedList, mais il n'inclut pas le formset en ligne qui contient les OrderedListRows, donc il ne peut pas atteindre ces données. Je peux remplacer le formulaire en ligne de OrderedListRows, mais il ne peut pas atteindre la liste. J'ai besoin d'un moyen dans le contexte de validation de formulaire pour atteindre les données de formulaire de OrderedList et les données de formulaire du formset afin que je puisse vérifier tous les sites des objets de contenu OrderedListRow par rapport au site de OrderedList et lancer une erreur de validation en cas de problème . Jusqu'à présent, je n'ai pas trouvé de fonction dans laquelle les données nettoyées pour OrderedRow et OrderedListRows sont contenues.

Répondre

5

Dans le formset en ligne, self.instance doit faire référence à l'objet parent, à savoir la OrderedList.

1

Je suis confronté au même problème. Et malheureusement, je ne pense pas que la réponse ci-dessus couvre entièrement les choses. En cas de modification à la fois du formset en ligne et du formulaire d'administration, l'accès à self.instance ne donnera pas de données précises, puisque vous baserez la validation sur la base de données, puis sauvegarderez le formset qui écrasera les données précédemment utilisées. valider les choses. Fondamentalement, cela rend votre validation une sauvegarde derrière.

Je suppose que la vraie question ici est de savoir qui est sauvegardé en premier. Après avoir creusé le code source, il semble que le site admin ait d'abord enregistré le formulaire. Cela signifie que, logiquement, faire une validation sur le formset et, de là, accéder à l'instance 'parent' devrait obtenir des valeurs cohérentes.

+0

Finalement, j'ai créé un formset pour le OrderedListRow en ligne et ai fait une substitution de sa fonction clean(). Dans ce document, j'ai pu tirer l'ID du site en disant site_id = self.data.get (« site ») Avec « site » étant le nom du champ du site que la OrderedList mère utilise. Essentiellement, j'y accède directement à partir des données du formulaire. Une fois que j'ai eu l'ID de site qui a été soumis, je pourrais itérer à travers toutes les formes du formset OrderedListRow, et comparer le site de leur contenu au site OrderedList. – KRH

Questions connexes