2012-05-30 19 views
6

jedną z form potrzebne jest złożony z prostych pól (powiedzmy „kategorii”, „budynek” i „RoomNumber”), a także dynamicznie generowanych par pola (powiedzmy „nazwa” i " E-mail"). Najlepiej byłoby edytować zawartość prostych pól i dodawać/usuwać pary pól dynamicznych w jednym formularzu.Django: formset jako pole formularza

W odniesieniu do kodu, zastanawiam się, czy próba osadzenia zestawu (formularza z dwoma dynamicznymi polami) jako pola w zwykłej formie jest rozsądnym podejściem lub jeśli istnieje inna najlepsza praktyka, aby osiągnąć to, co ja ". chciałbym osiągnąć.

Wielkie dzięki za wszelkie rady w tych kwestiach,

+0

Potrzebujemy kodu do rozpoczęcia pracy =) – okm

Odpowiedz

8

nie jestem pewien, gdzie się pomysł, że trzeba „osadzić formset jako pole” pochodzi od; to brzmi jak skrzynka dla standard usage of formsets.

Na przykład (co cały szereg założeń o swoich modelach):

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) 

a następnie, do widzenia:

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 

możliwych usprawnień:

  • Wpisz się django-dynamic-formset jQuery plugin aby uzyskać pożądany „chyba-dodać dowolną liczbę pracowników do biura” funkcjonalność bez pokazywania u sers stos pustych formularzy za każdym razem.
  • Zamiast tego należy użyć model formsets (zakładając, że zbierane informacje są wspierane przez modele Django), więc nie trzeba jednoznacznie określać nazw lub typów pól.

Mam nadzieję, że to pomoże.

+1

Dzięki za wskazanie tego. Byłem wprowadzony w błąd przez fakt, że pomyślałem (kto wie dlaczego), że byłoby bardziej praktyczne, gdyby 'StaffFormSet' został jakoś zadeklarowany jako pole' OfficeForm'. Podam twoje podejście. – Mark

+0

ja też błędnie myślałem że formset powinny być pola w formularzu, ale ta odpowiedź pomogła. Aby dodać do odpowiedzi, w szablonie wyrenderujesz 'form' i' formset' wewnątrz tego samego znacznika HTML 'form'. W ten sposób wszystkie dane formularzy powracają w tym samym POST. – Seth

Powiązane problemy