2012-05-30 18 views
6

una delle forme di cui ho bisogno è un composto di campi semplici (ad esempio "Dipartimento", "Edificio" e "Numero stanza") e di coppie di campi generate dinamicamente (ad esempio "Nome" e " E-mail"). Idealmente, la modifica dei contenuti dei campi semplici e l'aggiunta/rimozione di coppie di campi dinamici verrebbero eseguite su un unico modulo.Django: Formset come campo modulo

Per quanto riguarda il codice, mi chiedo se provare a incorporare un Formset (di un modulo con i due campi dinamici) come un campo in una forma ordinaria sia un approccio ragionevole o se esiste un'altra best practice per ottenere ciò che io Mi piacerebbe realizzare.

Molte grazie per qualsiasi consiglio su queste questioni,

+0

Abbiamo bisogno di un codice per iniziare a lavorare =) – okm

risposta

8

io non sono sicuro dove l'idea che è necessario "incorporare un Formset come un campo" viene da; questo suona come un caso per lo standard usage of formsets.

Per esempio (facendo tutta una serie di ipotesi circa i vostri modelli):

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) 

E poi, per la visualizzazione:

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 

Possibili miglioramenti:

  • Utilizzare i django-dynamic-formset jQuery plugin per ottenere la funzionalità "aggiungi un numero arbitrario di personale a un ufficio" desiderata senza mostrare riceve una pila di moduli vuoti ogni volta.
  • Utilizzare invece model formsets (supponendo che le informazioni che si stanno raccogliendo siano supportate dai modelli Django), quindi non è necessario specificare esplicitamente i nomi oi tipi di campo.

Spero che questo aiuti.

+1

Grazie per aver segnalato questo. Sono stato indotto in errore dal fatto che pensavo (chissà perché), che sarebbe stato più pratico se il 'StaffFormSet' fosse in qualche modo dichiarato come un campo di' OfficeForm'. Darò il tuo approccio una prova. – Mark

+0

Ho anche pensato erroneamente che il formset dovesse essere un campo sul modulo, ma questa risposta ha aiutato. Per aggiungere alla risposta, nel tuo modello, renderete 'form' e' formset' all'interno dello stesso tag 'form' HTML. In questo modo tutti i dati del modulo tornano nello stesso POST. – Seth

Problemi correlati