Wie man ein Django-Formular manuell testen kann

Mit etwas Handarbeit kann man oft leichter herausbekommen, warum ein Django-Formular zickt und was da im Hintergrund passiert.

  • myapp.forms oder MyForm von myapp.forms importieren.

  • Wenn es ein ModelForm ist:

    myform = MyForm(instance=some_obj)

    aufrufen, ggf. mit initial=dict(…).

    Wenn es kein ModelForm ist, ohne das instance-Argument.

  • Aus dem Formular die Daten auslesen, die im Template als HTML-<form> gerendert würden:

    post_data = {vf.name: vf.initial for vf in myform.visible_fields()}
    post_data.update({vf.name: vf.initial for vf in myform.hidden_fields()})

    (Die zweite Zeile kann entfallen, wenn es keine hidden fields gibt.)

  • Ggf. post_data verändern, um eine Eingabe zu simulieren. (Erforderliche Felder setzen!)

  • Damit ein gebundenes Formular erzeugen:

    b_myform = MyForm(post_data)
    b_myform.is_valid()

    Wenn is_valid() False liefert, können mit b_myform.errors die Fehler angezeigt werden.

  • Bei einem ModelForm kann das zugehörige Objekt mit b_myform.save() gesichert werden. Will man nicht direkt in die Datenbank schreiben, kann stattdessen

    obj = b_myform.save(commit=False)

    aufgerufen und obj inspiziert werden. Will man es dann doch in die Datenbank bringen, macht man dies mit

    obj.save()
    b_myform.save_m2m()

    (Das letztere Kommando bewirkt nur etwas, wenn das Model ManyToMany-Felder enthält.)