[django] Form/POST Daten verändern in Preview...

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 20. Februar 2009, 08:41

Ich möchte gern in einem Form-Preview (ähnlich wie django's form-preview) die Daten der Form ändern und in der geänderten Variante wieder anzeigen lassen. Das ist allerdings nicht so einfach...
Eine Variante hab ich nun gefunden, hier mal ein Beispiel:

Code: Alles auswählen

from django import forms
from django.http import QueryDict

POST = QueryDict(query_string="foo=bar")
print POST

class Form(forms.Form):
    foo = forms.CharField()

form = Form(POST)
form.is_valid()
print form.cleaned_data
print form.as_p().replace(">",">\n")

# Ansonsten: AttributeError: This QueryDict instance is immutable
form.data._mutable = True
form.data["foo"] = "new"
form.data._mutable = False

print form.as_p().replace(">",">\n")
Ausgabe:

Code: Alles auswählen

<QueryDict: {u'foo': [u'bar']}>
{'foo': u'bar'}
<p>
<label for="id_foo">
Foo:</label>
 <input type="text" name="foo" value="bar" id="id_foo" />
</p>

<p>
<label for="id_foo">
Foo:</label>
 <input type="text" name="foo" value="new" id="id_foo" />
</p>
Also es klappt soweit. Aber ist irgendwie unschön, das erforderliche Anfassen von form.data._mutable.
Fällt irgendwem eine bessere Lösung ein?

btw. es ist für einen Markup Konverter in PyLucid ( http://code.google.com/p/python-creole/ ).

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Freitag 20. Februar 2009, 17:33

Etwas mehr Context würde helfen, warum willst du das nach der Validierung noch ändern?!
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Freitag 20. Februar 2009, 18:42

Mit http://trac.pylucid.net/changeset/1831 funktioniert das so in PyLucid:
  • 1. CMS Seite (mit html/textile/markdown oder rest markup) editieren
    2. Ziel markup einstellen (z.Z. geht nur html oder creole)
    3. auf preview button klicken (form submit)
    4. POST Daten kommen an
    5. konvertieren der Seite ins ziel markup
    6. Form wieder anzeigen, mit preview des neuen markups
    7. User editiert (auch mit erneutem preview), bricht ab oder speichert die Seite...
Der relevante Codeteil ist hier: http://trac.pylucid.net/changeset/1831/ ... e_admin.py

Das ändern der Form daten nach dem validieren passiert bei Punkt 5.
Das "Problem" ein POST QueryDict ist auf inmutable gesetzt, was ja normalerweise gut ist. In dem Fall will ich aber die Daten ändern. Geht so wie im Skript aus dem ersten Post (Zeile 16-18 ). Aber eine schönere Lösung wäre nett ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Freitag 20. Februar 2009, 22:23

Ich würd mir das ganze nicht so kompliziert machen, warum schreibst du nicht einfach einen Templatefilter der das konvertiert, den du dann in der preview verwendest? (Ich geh mal davon aus, dass du für die Preview so oder so ein eigenes Template verwendest); ansonsten könntest deinem Form noch eine as_preview Methode geben, die dann den einzelnen Feldtypen andere (html display, nicht input) Widgets verpasst (find ich aber nur dann nützlich, wenn du viel mit previews machst...).
Antworten