2010-06-09 5 views
1

J'ai un problème avec la nécessité de fournir plusieurs formulaires supportés par un modèle sur la même page. Je comprends comment faire cela avec des formulaires uniques, c'est-à-dire créer simplement les deux les appellent quelque chose de différent puis utiliser les noms appropriés dans le modèle.Comment puis-je afficher plusieurs formulaires modelformset django dans des ensembles de champs groupés?

Maintenant, comment pouvez-vous étendre cette solution pour qu'elle fonctionne avec les ensembles de modèles? La ride, bien sûr, est que chaque «forme» doit être rendue ensemble dans le fieldset approprié.

Par exemple, je veux que mon modèle pour produire quelque chose comme ceci:

Home Base Description: Vous voulez la crème glacée? Description de la base d'origine: Voulez-vous de la crème glacée?

J'utilise une boucle comme celui-ci pour traiter les résultats (après validation du formulaire)

base_models = base_formset.save(commit=False) 
like_models = like_formset.save(commit=False) 
for base_model, likes_model in map(None, base_models, likes_models): 

qui fonctionne comme je pense (j'utilise la carte parce que le nombre de formes peut être différent). Le problème est que je ne peux pas trouver un moyen de faire la même chose avec le moteur de modélisation. Le système fonctionne si je place tous les modèles de base ensemble, puis tous les modèles après, mais il ne répond pas aux exigences de mise en page.

EDIT: Mise à jour l'énoncé du problème pour être plus clair sur ce qu'est exactement je traitement (je suis le traitement de modèles non formes dans la boucle)

Répondre

2

De l'avis:

forms = itertools.izip(base_forms, likes_forms) 

En le modèle:

{% for (base_form,like_form) in forms %} 
+1

Remplacez ce qui précède par forms = itertools.izip_longest (base_forms.forms, likes_forms.forms) et vous êtes proche. Itérer sur ceux-ci dans une coquille semble produire le résultat correct, mais ... Je suis en train de traiter avec 3 formsets permet de les appeler base, aime, n'aime pas. Dans le rendu, j'obtiens les goûts affichés correctement, mais je n'ai pas de sortie pour la base ou les aversions. Je pense que c'est la bonne voie cependant. Je peux changer l'ordre de l'appel izip_longest et il affichera toujours seulement l'option du milieu. –

0

Après avoir fait une bonne quantité de fouiner et pirater expérimentons je suis venu avec la solution suivante grâce en partie à Ignacio énorme Vazquez-Abrams :)

De l'avis:

forms = itertools.izip_longest((None,),base_formset.forms, likes_formset.forms) 

Dans le modèle:

{% for (garbage1, base_form, like_form, garbage2) in forms %} 

Le lecteur astucieux peut remarquer que le nombre d'arguments dans la liste décompactage est un plus grand que ce qui a été donné à la izip_longest() méthode. Vous pouvez également noter qu'il existe une liste vierge en tant que premier argument.

Je ne pourrais jamais obtenir le modèle pour afficher le premier argument dans la liste d'où le premier argument factice. J'ai également trouvé que les éléments de la liste N-1 étaient rendus dans le modèle. Je suis également tombé sur le fait que le gabarit ne se soucie pas beaucoup d'une différence de taille, donc en capitonnant l'avant et l'arrière, j'ai été en mesure d'obtenir les formes que je voulais réellement afficher!

REMARQUE: Lors du traitement du POST, je construis simplement les formsets avec lesquels je travaille car toutes les données fantômes ne sont pas renvoyées via le POST.

Certainement pas la solution la plus propre et il est probablement extrêmement vulnérable à la casse amélioration, mais il est assez pratique pour travailler pour moi pour le moment.

Questions connexes