2013-06-18 36 views
9

Bir dizi alan barındıran bir django formları sınıfı oluşturmanın herhangi bir yolu var mı? Kullanıcıya sormak için değişken bir soru sayısı çekecek bir veri tabanım var ve her bir soru o pencere parçasının nasıl tanımlanacağını bilecek ... vb. Bunu django formlarına bağlayamıyorum.Django formlarında alanların listesi nasıl oluşturulur

class MyForm(forms.Form): 
    question = [] 
    questions = Question.objects.all() 
    for q in questions: 
     question.append(forms.CharField(max_length=100, label=q.questionText)) 

Ama bu MyForm yeni bir örneğini oluşturduğunuzda sorularım listesini açığa görünmüyor:

Bu çalıştı. Django formlarını kullanarak değişken sayıda form alanı elde etmenin herhangi bir yolu var mı, yoksa bu neler yapabileceğinin kapsamı dışında mı?

+0

Form sınıflarıyla kendileri için bir fabrika deseni kullanmayı düşündünüz mü? Bir listede olabilecek herhangi bir sayıdaki formları işleyebilirsiniz. – Brandon

cevap

10

Formlarınız aynıysa (etiketleri dahil) formsets kullanabilirsiniz. Örneğin.

Soru: __________________
Soru: __________________
Soru: __________________

vb ben her formu farz ediyorum burada yalnızca bir alan ('Question' alanı) içeriyor. Bu örnekte üç form vardır. Bir tek formda alanların dinamik sayıda gerekiyorsa


, o zaman ne istediğini elde etmek için __init__ kullanabilirsiniz (not:! denenmemiş kodu):

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     questions = kwargs.pop('questions') 
     super(MyForm, self).__init__(*args, **kwargs) 
     counter = 1 
     for q in questions: 
      self.fields['question-' + str(counter)] = forms.CharField(label=question) 
      counter += 1 

Ve' gibi bir şeyle form oluşturmak d:

form = MyForm(questions=your_list_of_questions) 

Sen bu makale yararlı bulacaksınız: http://jacobian.org/writing/dynamic-form-generation/

+0

Güzel makale, ben 'self.fields [' '] = 'mantık gerçekten ne eksik olduğunu (en azından en kolay yolu nerede olduğumu almak için Olmak istediğim yer). Cevap için teşekkürler! –

6

Elbette yapabilirsin!

class MyForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
     super(MyForm, self).__init__(*args, **kwargs) 
     for i, q in enumerate(Question.objects.all()): 
      self.fields['%s_field' % i] = forms.CharField(max_length=100, label=q.questionText) 

Not: sorular çağrılar arasında sıralanır emin olun alan listesi verileri sipariş edilirse vb

form gönderme, alınması üzerine yeniden yerleştirilmesi ve statik olacak şekilde .., böyle olmaz sorun olmak

Ayrıca, durumunuza daha uygun olabilecek formların bir listesi olan FormSet s'ye de bakmak isteyebilirsiniz.

+0

@KevinDiTraglia: Eğer ben olsaydım ben formetsets ile gitmek istiyorum – marianobianchi

İlgili konular