2012-05-30 24 views
6

ihtiyaç duyduğum formlardan biri basit alanlar ("Departman", "Building" ve "RoomNumber" gibi) ve dinamik olarak oluşturulmuş alan çiftlerinin ("Name" ve "diyelim) bir bileşimidir. E-posta "). İdeal olarak, basit alanların içeriğinin düzenlenmesi ve dinamik alan çiftlerinin eklenmesi/kaldırılması tek bir formda gerçekleştirilecektir.Django: Formset form alanı olarak formset

Code-wise, bir Formset'i (iki dinamik alanlı bir formun) sıradan bir formda bir alan olarak yerleştirmeye çalışmanın mantıklı bir yaklaşım mı olduğunu veya ne yaptığımı elde etmek için başka bir iyi uygulama varsa merak ediyorum. d başarmak ister. Sana "bir alan olarak bir Formset gömmek" için gereken fikri nereden geldiğini emin değilim

+0

Çalışmaya başlamak için bazı kodlara ihtiyacımız var =) – okm

cevap

8

bu konularda herhangi bir tavsiye için

çok teşekkürler; Bu standard usage of formsets için bir durum gibi geliyor. görünümünüz için, daha sonra

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) 

Ve:

Örneğin (senin modelleri hakkında varsayımlar bir bütün ana yapım)

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 

Olası gelişmeler:

  • Kullanım django-dynamic-formset jQuery plugin, muhtemelen "istenen bir sayıyı bir ofise ekleyin" işlevini u olmadan gösterme her seferinde bir yığın boş form bırakır.
  • model formsets kullanın (topladığınız bilgilerin Django modelleri tarafından desteklendiği varsayılarak), bu nedenle alan adlarını veya türlerini açıkça belirtmeniz gerekmez.

Bu yardımcı olur umarım.

+1

Bunu işaretlediğiniz için teşekkürler. Ben (neden kim bilir), "StaffFormSet" bir şekilde "OfficeForm" alanı olarak ilan edilirse, daha pratik olacağını düşündüm gerçeğiyle yanıltıcı oldu. Yaklaşımını deneyeceğim. – Mark

+0

Ayrıca yanlışlıkla formun formdaki bir alan olması gerektiğini düşündüm, ancak bu yanıt yardımcı oldu. Cevaba eklemek için, şablonunuzda, aynı HTML 'form' etiketinin içinde 'form' ve' formset 'ibaresini oluşturacaksınız. Bu şekilde, tüm form verileri aynı POST'ta geri gelir. – Seth

İlgili konular