2008-10-22 8 views
17

Dire que j'ai une forme comme:Django Forms - Comment utiliser le préfixe Paramètre

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

Et je veux montrer deux fois sur une page dans une forme étiquette chaque fois avec un préfixe différent, par exemple ,:

Lorsque l'utilisateur soumet ceci, comment puis-je récupérer le formulaire soumis dans deux formulaires distincts pour effectuer la validation et le réafficher?

This was the only documentation Je pourrais trouver et c'est un petit creux.

Répondre

31

Vous traitez chaque formulaire comme vous le feriez normalement, en vous assurant de créer des instances ayant les mêmes préfixes que ceux utilisés pour générer le formulaire initialement.

Voici un exemple un peu maladroit en utilisant le formulaire que vous avez donné, comme je ne sais pas ce que le cas précis d'utilisation est:

def some_view(request): 
    if request.method == 'POST': 
     form1 = GeneralForm(request.POST, prefix='form1') 
     form2 = GeneralForm(request.POST, prefix='form2') 
     if all([form1.is_valid(), form2.is_valid()]): 
      pass # Do stuff with the forms 
    else: 
     form1 = GeneralForm(prefix='form1') 
     form2 = GeneralForm(prefix='form2') 
    return render_to_response('some_template.html', { 
     'form1': form1, 
     'form2': form2, 
    }) 

Voici quelques exemples de code dans le monde réel qui montre des formes de traitement à l'aide de la préfixe:

http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/

+0

Merci, c'est exactement ce que je cherchais! – Greg

5

mieux encore, je pense que formsets est exactement ce que vous cherchez.

class GeneralForm(forms.Form): 
    field1 = forms.IntegerField(required=False) 
    field2 = forms. IntegerField(required=False) 

from django.forms.formsets import formset_factory 

# GeneralSet is a formset with 2 occurrences of GeneralForm 
# (as a formset allows the user to add new items, this enforces 
# 2 fixed items, no less, no more) 
GeneralSet = formset_factory(GeneralForm, extra=2, max_num=2) 

# example view 

def someview(request): 
    general_set = GeneralSet(request.POST) 
    if general_set.is_valid(): 
     for form in general_set.forms: 
      # do something with data 
    return render_to_response("template.html", {'form': general_set}, RequestContext(request)) 

Vous pouvez même avoir un formset généré automatiquement à partir d'un modèle avec modelformset_factory, qui sont utilisés par l'administrateur de django automatisé. FormSet gère encore plus de choses que des formulaires simples, comme l'ajout, le retrait et le tri d'éléments.

Questions connexes