2013-06-18 10 views
9

Gibt es eine Möglichkeit, eine Django-Formularklasse zu erstellen, die tatsächlich ein Array von Feldern enthält? Ich habe eine Datenbank, die eine variable Anzahl von Fragen hochzieht, um den Benutzer zu fragen, und jede Frage wird wissen, wie man ihr Widget definiert ... etc, ich kann es einfach nicht scheinen, dies mit Django-Formularen zu verbinden.So erstellen Sie eine Liste von Feldern in Django-Formularen

Ich habe versucht, dieses:

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

Aber dies scheint nicht meine Fragen Liste aussetzen, wenn ich eine neue Instanz von MyForm erstellen. Gibt es eine Möglichkeit, eine variable Anzahl von Formularfeldern mit Hilfe von Django-Formularen zu erhalten, oder liegt das daran, was es tun kann?

+0

Haben Sie darüber nachgedacht, ein Factory-Muster mit Formularklassen selbst zu verwenden? Sie können beliebig viele Formulare in einer Sicht bearbeiten, die sich in einer Liste befinden könnte. – Brandon

Antwort

10

Sie können möglicherweise formsets verwenden, wenn Ihre Formulare identisch sind (einschließlich ihrer Etiketten). z.B.

Frage: __________________
Frage: __________________
Frage: __________________

etc. Ich bin jede Form unter der Annahme, enthält nur ein Feld hier (die 'Frage' Feld). In diesem Beispiel gibt es drei Formen.


Wenn Sie eine dynamische Anzahl von Feldern in einer einzigen Form benötigen, dann können Sie __init__ verwenden, um zu erreichen, was Sie wollen (Anmerkung: ungetestet Code):

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 

Und Sie‘ d die Form mit so etwas wie erstellen:

form = MyForm(questions=your_list_of_questions) 

Sie finden diesen Artikel nützlich: http://jacobian.org/writing/dynamic-form-generation/

+0

Nice article, ich denke, die 'self.fields [''] =' Logik ist, was ich wirklich vermisst habe (zumindest der einfachste Weg, von wo ich zu bekommen bin wo ich sein will). Danke für die Antwort! –

6

Natürlich können Sie!

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) 

Hinweis: Stellen Sie sicher, dass Ihre Fragen zwischen den Anrufen bestellt .. als die Feldliste auf Formular-Vorlage wird neu besiedelt wird, den Empfang, usw.

Wenn die Daten und statische bestellt wird, wird es nicht ein Problem sein.

Sie können auch in FormSet s suchen, eine Liste von Formen, die in Ihrem Fall passender sein können.

+0

@KevinDiTraglia: Ich würde mit Formsets gehen, wenn ich Sie wäre – marianobianchi

Verwandte Themen