/ / Django Autogenerate POST-Datendiktat für beliebige Verwaltungsform - Python, Django, Unit-Testing, Testing, Django-Admin

Django generiert POST-Daten automatisch für beliebige Admin-Formulare - Python, Django, Unit-Testing, Testing, Django-Admin

Ich möchte ein Wörterbuch mit Daten automatisch generierenPOST in ein Django-Admin-Änderungsformular, als ob sich das aktuelle Objekt nicht ändert. Grundsätzlich simulieren Sie die POST-Anforderung, die auftreten würde, wenn Sie auf der Änderungsseite vom Administrator ein GET ausführen, und klicken Sie dann auf Speichern. Dabei sollte berücksichtigt werden, welche Felder in dem jeweiligen Änderungsformular bearbeitet werden können auch mit InlineAdmins umgehen können.

    def auto_generate_changeform_data(object):
data = ???
return data

Zum Beispiel in Zeile 302 von die django admin testcases Sie erstellen das POST-Datenwörterbuch manuell, aber dies sollte automatisch generiert werden können, richtig?

Ich würde diese Funktion dann in einem Testfall verwenden, in dem ich testen möchte, was passiert, wenn ich ein bestimmtes Feld in diesem Modell oder sogar eines der Inlines ändert.

    #some testcase
some_object = SomeModel.objects.get(...)
url = reverse("admin:appname_modelname_change", args=[some_object.id])
data = auto_generate_changeform_data(some_object)
data["some_field"] = "new value"  #this is the only change I want to make
response = self.client.post(url, data)

Ich könnte all dies auf eine eher einheitliche Weise tun, indem ich die Methoden der Klasse ModelAdmin benutze, anstatt eine POST-Anforderung an den Client zu senden, aber ich möchte eine Funktionstest In diesem Fall kein Gerätetest. Ich möchte eigentlich den vollständigen POST zur URL simulieren.

Wie bekomme ich dieses Datenwörterbuch, insbesondere den Teil über Inline-Formulare?

Antworten:

1 für die Antwort № 1

Ich habe dies zuvor getan, indem ich einfach die GET-Anfrage mit dem Testclient durchführte und dann BeautifulSoup zum Auskratzen all der verwendeten input und select Elemente.

Es ist nicht ganz einfach, weil diese Elemente auf unterschiedliche Weise ihre Werte darstellen, aber Hier ist ein Code, der funktionieren sollte.