2010-06-01 4 views
1

J'ai une application simple où les utilisateurs sont censés parier sur le résultat d'une correspondance. Un match consiste en deux équipes, un résultat et un enjeu. Les matchs avec des équipes sont créés dans l'admin Django, et les participants doivent remplir le résultat et l'enjeu.Rendu plusieurs instances Formulaire

Le formulaire doit être généré dynamiquement, en fonction des correspondances dans la base de données.

Mon idée est d'avoir une instance de formulaire (Django) pour chaque correspondance et de passer ces instances au modèle.

Cela fonctionne très bien quand je le fais depuis le shell django, mais les instances ne sont pas rendues quand je charge ma vue.

La forme ressemble à ceci:

class SuggestionForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     try: 
      match = kwargs.pop('match') 
     except KeyError: 
      pass 
     super(SuggestionForm, self).__init__(*args, **kwargs) 
     label = match 
     self.fields['result'] = forms.ChoiceField(label=label, required=True, choices=CHOICES, widget=forms.RadioSelect()) 
     self.fields['stake'] = forms.IntegerField(label='', required=True, max_value=50, min_value=10, initial=10) 

Mon (préliminaire) vue ressemble à ceci:

def suggestion_form(request): 
    matches = Match.objects.all() 
    form_collection = {} 

    for match in matches: 
     f = SuggestionForm(request.POST or None, match=match) 
     form_collection['match_%s' % match.id] = f 

    return render_to_response('app/suggestion_form.html', { 
     'forms': form_collection, 
     }, 
     context_instance = RequestContext(request) 
     ) 

Ma première pensée était que je pouvais passer le form_collection au modèle et la boucle throught la collection comme ceci, mais l'id ne fonctionne pas:

 {% for form in forms %} 
      {% for field in form %} 
       {{ field }} 
      {% endfor %} 
     {% endfor %} 

(la sortie est réellement les touches dict avec des espaces ajoutés entre chaque lettre - je ne sais pas pourquoi ...)

Cela fonctionne si je ne fais que passer une instance de formulaire au modèle et exécute seulement la boucle interne.

Les suggestions sont grandement appréciées.

Répondre

1

itérer sur un dictionnaire dans un modèle de django vous devez utiliser:

{% for key,value in dictionary.items %}{{ value }}{% endfor %} 

donc

{% for key, value in forms.items %} 
    {% for field in value %} 
     {{ field }} 
    {% endfor %} 
{% endfor %} 

devrait faire l'affaire! Sinon, vous pourriez mettre vos formulaires dans une liste, ce qui aurait plus de sens si votre objectif principal est de conserver leur ordre et d'avoir le code du modèle tel qu'il est!

+0

Merci, ça l'a fait! Je suis d'accord que c'est une meilleure idée de mettre les instances de formulaire dans une liste à la place. – vorpyg

5

Encore une fois, la meilleure façon d'avoir plusieurs formulaires sur une page est d'utiliser formsets.