2013-06-18 18 views
9

Esiste un modo per creare una classe di form di django che detenga effettivamente una serie di campi? Ho un database che richiamerà un numero variabile di domande da porre all'utente e ogni domanda saprà come definire il suo widget ... ecc., Non riesco proprio ad associarlo a forme di django.Come creare un elenco di campi nei moduli di django

ho provato questo:

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

Ma questo non sembra per esporre la mia lista domande quando creo una nuova istanza di MyForm. C'è un modo per ottenere un numero variabile di campi di modulo usando i moduli di django, o questo va oltre lo scopo di ciò che può fare?

+0

Hai mai pensato di utilizzare uno schema di fabbrica con le classi del modulo? È possibile elaborare qualsiasi numero di moduli in una vista, che potrebbe essere in un elenco. – Brandon

risposta

10

Potrebbe essere possibile utilizzare formsets se i moduli sono identici (comprese le loro etichette). per esempio.

Domanda: __________________
Domanda: __________________
Domanda: __________________

ecc Sto assumendo ogni modulo contiene solo un campo qui (campo 'domanda'). Ci sono tre forme in questo esempio.


Se avete bisogno di un certo numero dinamica di campi in una forma singolo, quindi è possibile utilizzare __init__ per ottenere ciò che si vuole (nota: codice non testato):

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 

E' d creare il modulo con qualcosa di simile:

form = MyForm(questions=your_list_of_questions) 

troverete questo articolo utile: http://jacobian.org/writing/dynamic-form-generation/

+0

Bel articolo, penso che la logica di 'self.fields [''] =' è quello che mi mancava davvero (almeno il modo più semplice per arrivare da dove sono dove voglio essere). Grazie per la risposta! –

6

Certo che puoi!

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) 

Nota: assicurarsi che le domande sono ordinate da una chiamata .. come l'elenco dei campi verrà ripopolata sul modulo di presentazione, ricevimento, ecc

Se i dati è ordinato e statico, non lo farà essere un problema

Inoltre, si consiglia di esaminare FormSet s, un elenco di moduli che potrebbero essere più adatti nel vostro caso.

+0

@KevinDiTraglia: vorrei andare con i formet se fossi in te – marianobianchi

Problemi correlati