27 Stimmen

Übergeben von Argumenten an ein dynamisches Formular in Django

Ich habe ein dynamisches Formular in Formularen. Wie kann ich ein Argument von meiner Ansicht aus übergeben, wenn ich mein Formular instantiiere?

So etwas wie:

form = DynamicForm("einige Zeichenfolgenargumente, die ich an mein Formular übergebe")

Dies ist das Formular, das ich habe:

Klasse DynamicForm(Formular):
def __init__(self, *args, **kwargs):
    super(DynamicForm, self).__init__(*args, **kwargs)
    für Element in Bereich(5):
        self.fields['test_field_%d' % Element] = CharField(max_length=255)

57voto

gruszczy Punkte 39020

Fügen Sie es als Schlüsselwortargument hinzu. Nehmen wir an, es heißt my_arg. Stellen Sie sicher, dass Sie das Schlüsselwortargument mit pop() entfernen, bevor Sie super() aufrufen, da die init ()-Methode der Elternklasse keine zusätzlichen Schlüsselwortargumente akzeptiert.

class DynamicForm(Form):
  def __init__(self, *args, **kwargs):
    my_arg = kwargs.pop('my_arg')
    super(DynamicForm, self).__init__(*args, **kwargs)
    for item in range(5):
        self.fields['test_field_%d' % item] = CharField(max_length=255)

Und wenn Sie ein Formular erstellen, sieht es so aus:

form = DynamicForm(..., my_arg='value')

10 Stimmen

Nur zur Info, als ich über **kwargs gelernt habe, habe ich immer den Fehler bekommen: __init__() hat ein unerwartetes Schlüsselwortargument 'my_arg' erhalten. Du musst deine Argumente in der ersten Zeile des Konstruktors entfernen oder zumindest hat mir das geholfen, meine Probleme zu lösen.

0 Stimmen

Ich möchte in der Lage sein, DynamicForm zu erben, sodass ich eine Basisklasse Form habe, der ich benutzerdefinierte Parameter übergeben kann. Können Sie ein Beispiel zeigen?

9 Stimmen

@krizajB tatsächlich müssen Sie kwargs.pop vor super() verwenden, sonst erhält die Basisklasse Argumente, die sie nicht unterstützt. Aber es muss nicht die erste Zeile sein.

0voto

unlockme Punkte 3290

Sie können dies auch erreichen, indem Sie das get_form_kwargs des FormMixin überschreiben, das in klassenbasierten Ansichten verfügbar ist.

class CustomDynamicFormView(FormView):  # erben Sie eine Ansicht mit Formmixin...
      form_class = DynamicForm

      def get_form_kwargs(self):
          kwargs = super(CustomDynamicFormView, self).get_form_kwargs()
          kwargs['custom_variable'] = 'meine benutzerdefinierte Variable'
          return kwargs

Dann in Ihrem Formular

class DynamicForm(forms.Form):
    def __init__(self, *args, **kwargs):
        my_var = kwargs.pop('custom_variable') 
        # entfernen Sie dies, bevor Sie super aufrufen, sonst wird es beanstandet
        super(DynamicForm, self).__init__(*args, **kwargs)
        # tun Sie, was Sie mit my_var möchten

Weitere Informationen finden Sie hier

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X