Django-de

Django Dokumentation

Formular Vorschau

Diese Dokumentation gilt für Djangos Entwicklerversion, die zum Teil erhebliche Unterschiede zur letzten veröffentlichen Version aufweist.

Django verfügt über eine optionale “Formular Vorschau” Anwendung, die hilft, folgenden Arbeitsablauf zu automatisieren:

“Html Code anzeigen, Vorschau erzwingen und dann etwas mit der Eingabe zu machen.”

Um eine Vorschau einer Formulareingabe zu erzwingen, musst du nur eine kurze Python Klasse schreiben.

Überblick

Gegeben ist eine django.newforms.Form Subklasse, die du definiert hast. Diese Anwendung kümmert sich um folgenden Arbeitsablauf:

  1. Zeigt das Formular als HTML auf der Webseite an.
  2. Validiert die Formulardaten, wenn es durch die POST Methode eingereicht wird. a. Wenn sie gültig ist, zeige eine Vorschauseite. b. Wenn sie ungültig ist, zeige das vorherige Formular mit Fehlermeldungen
  3. Wenn das “Bestätigungsformular” von der Vorschaupage gesendet wird, rufe einen definierten Hook auf — eine done() Methode, die die validierten Daten übergeben bekommt.

Das Framework setzt die vorgeschriebene Vorschau durch, indem es einen geheimen, gemeinsamen Hash zu der Vorschaupage durch versteckte Formularfelder weitergibt. Wenn jemand die Formularparameter der Vorschaupage ändert, wird die Formulareingabe den Hashvergleichstest nicht bestehen.

Wie man FormPreview benutzt

  1. Dirigiere Django zu den standardmäßigen FormPreview Templates. Es gibt zwei Wege dies zu machen:

    • Füge 'django.contrib.formtools' zu deiner INSTALLED_APPS Einstellung hinzu. Das wird funktionieren, wenn deine TEMPLATE_LOADERS Einstellungen den app_directories Template Loader einfügt (was standardmäßig der Fall ist). Siehe die Template Loader Dokumentation für mehr.
    • Ansonsten finde den vollen Pfad deines Dateisystems zu den django/contrib/formtools/templates Verzeichnis heraus, und füge ihn zu deiner TEMPLATE_DIRS Einstellung hinzu.
  2. Erstelle eine FormPreview Subklasse, die die done() Methode überschreibt:

    from django.contrib.formtools.preview import FormPreview
    from myapp.models import SomeModel
    
    class SomeModelFormPreview(FormPreview):
    
        def done(self, request, cleaned_data):
            # Mache etwas mit den cleaned_data, und verweise dann
            # auf eine "success" Page.
            return HttpResponseRedirect('/form/success')
    

    Diese Methode nimmt ein HttpRequest Objekt und ein Dictionary von den Formulardaten an, nachdem sie validiert und gesäubert (engl. cleanded) wurden. Es sollte ein HttpResponseRedirect zurückgeben, dass das Endresultat des eingereichten Formulars ist.

  3. Ändere deine URLconf, um auf eine Instanz deiner FormPreview Subklasse zu verweisen:

    from myapp.preview import SomeModelFormPreview
    from myapp.models import SomeModel
    from django import newforms as forms
    

    …und füge die folgende Zeile zu dem dazugehörigen Modell in der URLconf hinzu:

    (r'^post/$', SomeModelFormPreview(forms.models.form_for_model(SomeModel))),
    

    Oder, Wenn du schon eine Formular Klasse für dein Modell definiert hast:

    (r'^post/$', SomeModelFormPreview(SomeModelForm)),
    
  4. Starte den Django-Server und besuche /post/ in deinem Browser.

FormPreview Klassen

Eine FormPreview Klasse ist eine simple Python-Klasse, die den Ablauf der Vorschau darstellt. FormPreview Klassen müssen Subklassen von django.contrib.formtools.preview.FormPreview sein und die done() Methode überschreiben. Sie können irgendwo in deinem Code angesiedelt werden.

FormPreview Templates

Standardmäßig wird das Formular mittels des Templates formtools/form.html gerendert und die Vorschauseite mittels des Templates formtools.preview.html. Diese Werte können, durch Einsetzen der preview_template und form_template Attribute in der FormPreview Subklasse, für eine bestimmte Formularvorschau überschrieben werden. Siehe django/contrib/formtools/templates für die Standardtemplates.