2013-08-21 6 views
8

Ich habe Schwierigkeiten beim Zugriff auf die Daten über mein Formularsatz. Hier ist mein Code:Django Zugreifen auf Formularsatzdaten

Vorlage:

<form action="" method="post"> 
    {% csrf_token %} 
    {{ formset.management_form }} 
    {% for form in formset %} 

    {{ form.as_p }} 

    {% endfor %} 

    <input type="submit" value="Submit"> 

</form> 

Ausblick:

def addMembers(request, id, members): 
    if request.user.is_authenticated(): 
     members = int(members) 
     MemberFormSet = formset_factory(MemberForm, extra = members) 
     if request.method == 'POST': 
      print 'post' 
      formset = MemberFormSet(request.POST) 
      if formset.is_valid(): 
       cd = formset.cleaned_data 
       for f in formset: 
        first_name = cd.first_name 
        last_name = cd.last_name 
        email = cd.email 
        house = House.objects.get(id = id) 
        member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now()) 
        member.save() 
       return HttpResponseRedirect(reverse('houses:controlPanel')) 
     else: 
      formset = MemberFormSet() 
     return render_to_response('houses/add_members.html', {'formset' : formset}, context_instance = RequestContext(request)) 
    return HttpResponseRedirect(reverse('allauth.account.views.login')) 

ich verschiedene Möglichkeiten, die Daten zugreifen beiseite versucht haben, was zur Zeit einschließlich geschrieben: f['attribute'] cd['attribute'] request.POST['attribute'] formset.cleaned_data['attribute']

Ich bekomme Fehler im Bereich von u"Key 'email' not found in Form" bis list indices must be integers, not str

Wie soll ich auf die Daten zugreifen, die von einem Formularsatz übergeben werden? Djangos Dokumentation gibt keine klare Antwort darauf und bei der Suche finde ich viele verschiedene Wege, aber keine, die bisher funktioniert haben. Danke für Ihre Hilfe.

Antwort

15

cd ist ein Wörterbuch. Außerdem sollten Sie die Wörterbuch Werte von den einzelnen Formen statt der formset

if request.method == 'POST': 
    formset = MemberFormSet(request.POST) 
    if formset.is_valid(): 
     for f in formset: 
      cd = f.cleaned_data 
      first_name = cd.get('first_name') 
      last_name = cd.get('last_name') 
      email = cd.get('email') 
      house = House.objects.get(id = id) 
      member = Member(first_name = first_name, last_name = last_name, email = email, house = house, created_on = timezone.now()) 
      member.save() 
     return HttpResponseRedirect(reverse('houses:controlPanel')) 
+0

Sie müssen 'f.is_valid()' nicht überprüfen. Ein Formset ist nicht gültig, es sei denn, alle seine Form sind ebenfalls gültig. –

+0

@PeterDeGlopper Sie haben Recht – karthikr

+0

eine Möglichkeit, dies vor is_valid zu überprüfen? – radtek

0

Ich denke, holen, sollten Sie eine model_formsetfactory werden, oder noch besser, ein inlineformset_factory. Sie füllen Modelle aus Formulardaten, für die sie bestimmt sind. Rufen Sie die Dirty-Modelle aus dem Formset auf, indem Sie commit = False verwenden und fügen Sie sie in Ihre House-Beziehung ein. So etwas wie dieses:

MemberFormSet = model_formset_factory(Member, extra= members) 
if request.method == POST: 
    formset = MemberFormSet(request.POST) 
    if formset.is_valid(): 
     house = House.objects.get(id = id) 
     models = formset.save(commit=False) 
     for member in models: 
      member.house = house 
      member.save() 
     return render(<your data>) 
else: 
    formset = MemberFormSet() 
return render(<your data>) 

Beachten Sie, dass Ihre get() auch eine Ausnahme auslösen wird, wenn das House-Objekt nicht existiert. Nur eine Design-Überlegung.