Django comes with an optional “form preview” application that helps automate the following workflow:
“Display an HTML form, force a preview, then do something with the submission.”
To force a preview of a form submission, all you have to do is write a short Python class.
Form preview doesn’t work with file uploads.
Form subclass that you define, this
application takes care of the following workflow:
- Displays the form as HTML on a Web page.
- Validates the form data when it’s submitted via POST. a. If it’s valid, displays a preview page. b. If it’s not valid, redisplays the form with error messages.
- When the “confirmation” form is submitted from the preview page, calls
a hook that you define – a
done()method that gets passed the valid data.
The framework enforces the required preview by passing a shared-secret hash to the preview page via hidden form fields. If somebody tweaks the form parameters on the preview page, the form submission will fail the hash-comparison test.
How to use
Point Django at the default FormPreview templates. There are two ways to do this:
This will work if your
TEMPLATESsetting includes the
app_directoriestemplate loader (which is the case by default).
See the template loader docs for more.
FormPreviewsubclass that overrides the
from django.http import HttpResponseRedirect from formtools.preview import FormPreview from myapp.models import SomeModel class SomeModelFormPreview(FormPreview): def done(self, request, cleaned_data): # Do something with the cleaned_data, then redirect # to a "success" page. return HttpResponseRedirect('/form/success')
This method takes an
HttpRequestobject and a dictionary of the form data after it has been validated and cleaned. It should return an
HttpResponseRedirectthat is the end result of the form being submitted.
Change your URLconf to point to an instance of your
from django import forms from myapp.forms import SomeModelForm from myapp.preview import SomeModelFormPreview
…and add the following line to the appropriate model in your URLconf:
SomeModelFormis a Form or ModelForm class for the model.
Run the Django server and visit
/post/in your browser.
FormPreview class is a simple Python class
that represents the preview workflow.
FormPreview classes must subclass
FormPreview and override the
method. They can live anywhere in your codebase.
By default, the form is rendered via the template
and the preview page is rendered via the template