Seite 1 von 1

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

Verfasst: Freitag 20. Februar 2009, 08:41
von jens
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/ ).

Verfasst: Freitag 20. Februar 2009, 17:33
von apollo13
Etwas mehr Context würde helfen, warum willst du das nach der Validierung noch ändern?!

Verfasst: Freitag 20. Februar 2009, 18:42
von jens
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 ;)

Verfasst: Freitag 20. Februar 2009, 22:23
von apollo13
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...).