[Django] Konvertieren von Werten für Formulare?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 28. April 2009, 20:34

Ich habe ein Verständnisproblem. Ich will ein `models.JSONField` haben. Das ist nicht weiter schwer zu bauen. Meine Klasse hat zwei Methoden `get_db_prep_value` und `to_python`, die etwas "JSON-artiges" in einen String verwandeln, damit dieser in der Datenbank als TEXT gespeichert werden kann und aus dem String wieder eine Ansammlung von dict, list und den entsprechenden Basistypen machen.

Nun möchte ich das ganze aber auch im Admin-UI bearbeiten können. Dazu muss ich das Python-Objekt zur Anzeige in einem Textarea in einen JSON-String verwandeln und zum Speichern die Rückrichtung implementieren. Diese kann ich als `clean` in einem `forms.Field` bauen. Aber die Hinrichtung?

Mir scheint, Django sieht nicht vor, Objekte zur Anzeige zu konvertieren! Kann das sein?

Man könnte wohl eine `forms.Textarea` Widget-Unterklasse bauen und dort die Konvertierung "verstecken", doch das Admin-UI ist recht eigen in dem was es benutzt und will da ein `AdminTextareaWidget` haben. Oder ich erbe davon... unbefriedigend.

Stefan
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Mittwoch 29. April 2009, 17:05

`formfield` überschreiben... Wenn das nicht klappt, `value_to_string` angucken (weiß nicht ob das was bringt, nur auf den ersten Blick sieht es passend aus).

Gruß
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mittwoch 29. April 2009, 19:40

@sma: Ich habe was ganz ähnliches gemacht in dem Ausgelagerten Projekt: http://code.google.com/p/django-dbpreferences

Hab mich allerdings gegen JSON entschieden und mein eigenes "serialisieren" Modul genommen.

Interessant für dich dürften diese beiden Dateien sein:
http://code.google.com/p/django-dbprefe ... /models.py
http://code.google.com/p/django-dbprefe ... s/admin.py

Ich wollte auch erst, das man ganz transparent auf die Daten zugreifen kann, hab mich aber im nachhinein dagegen entschieden. z.Z. kann man im admin Panel die serialisierte Form editieren und die Daten in einer richtigen form.

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Mittwoch 29. April 2009, 20:17

jens, dein dict hat bereits die richtige Repräsentation oder aus einem anderen Grund musst du die textuelle Darstellung nicht anpassen.

Dauerbaustelle, das value_to_string wird nur beim Serialisieren aufgerufen, nicht um einen Wert in einem Formular anzuzeigen.

Nach wie vor denke ich, hier hat Django ein generelles Problem.

Stefan
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 30. April 2009, 07:40

bzw. Ich nutzte pformat zur Darstellung.

Du kannst im JSONField bei formfield() das ganze so patchen, das ein eigenes widget genutzt wird. Dort kannst du dann in render() die JSON Daten wieder serialisieren. So habe ich das früher gemacht, siehe:
http://code.google.com/p/django-dbprefe ... c=svn2&r=2

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Donnerstag 30. April 2009, 20:16

jens, dass es einen Weg gibt, wenn ich das TextArea-Widget ändere, schrieb ich ja. Aber genau das wollte ich vermeiden, weil hier das Admin-UI ein eigenes benutzt. Die ändern bereits alle Widgets. Ich hatte gehofft, ich übersehe einen Weg, doch offenbar ist das eine ärgerliche Beschränkung von Django.

Stefan
Antworten