2012-05-30 21 views
6

eine der Formen, die ich brauche, ist eine Zusammensetzung von einfachen Feldern (sagen wir "Abteilung", "Gebäude" und "RoomNumber"), und von dynamisch erzeugten Paaren von Feldern (sagen "Name" und " Email"). Im Idealfall würde das Bearbeiten der Inhalte der einfachen Felder und das Hinzufügen/Entfernen dynamischer Feldpaare in einem einzigen Formular erfolgen.Django: Formset als Formularfeld

Code-weise, frage ich mich, ob der Versuch, ein Formset (eines Formulars mit den zwei dynamischen Feldern) als ein Feld in einer gewöhnlichen Form einzubetten, ein vernünftiger Ansatz ist oder wenn es eine andere Best Practice gibt, möchte ich erreichen.

Vielen Dank für jede Beratung in diesen Fragen,

+0

Wir brauchen Code, um mit der Arbeit zu beginnen =) – okm

Antwort

8

Ich bin nicht sicher, wo die Idee, dass man herkommt, „ein Formset als Feld einbetten“ muß; das klingt wie ein Fall für die standard usage of formsets.

Zum Beispiel (eine ganze Reihe von Annahmen über Ihre Modelle zu machen):

class OfficeForm(forms.Form): 
    department = forms.ModelChoiceField(... 
    room_number = forms.IntegerField(... 

class StaffForm(forms.Form): 
    name = forms.CharField(max_length=... 
    email = forms.EmailField(... 

from django.forms.formsets import formset_factory 

StaffFormSet = formset_factory(StaffForm) 

Und dann, für Ihre Ansicht:

def add_office(request): 
    if request.method == 'POST': 
     form = OfficeForm(request.POST) 
     formset = StaffFormSet(request.POST) 

     if form.is_valid() && formset.is_valid(): 
      # process form data 
      # redirect to success page 
    else: 
     form = OfficeForm() 
     formset = StaffFormSet() 

    # render the form template with `form` and `formset` in the context dict 

Mögliche Verbesserungen:

  • Verwenden Sie die django-dynamic-formset jQuery plugin, um die wahrscheinlich gewünschte "fügen Sie eine beliebige Anzahl von Mitarbeitern zu einem Büro" -Funktionalität, ohne u Sers ein Stapel leere Formulare jedes Mal.
  • Verwenden Sie stattdessen model formsets (vorausgesetzt, die von Ihnen gesammelten Informationen werden von Django-Modellen unterstützt), sodass Sie die Feldnamen oder -typen nicht explizit angeben müssen.

Hoffe das hilft.

+1

Danke, dass Sie darauf hingewiesen haben. Ich wurde durch die Tatsache irregeführt, dass ich dachte (wer weiß warum), dass es praktischer wäre, wenn das 'StaffFormSet' irgendwie als ein Feld der' OfficeForm' deklariert würde. Ich werde es versuchen. – Mark

+0

Ich dachte fälschlicherweise auch, dass das Formset ein Feld auf dem Formular sein sollte, aber diese Antwort half. Um die Antwort hinzuzufügen, rendern Sie in Ihrer Vorlage 'form' und' formset' innerhalb desselben HTML 'form' Tags. Auf diese Weise kommen alle Formulardaten im selben POST zurück. – Seth

Verwandte Themen