O Django vem acompanhado com uma aplicação opcional, “form preview”, que ajuda a automatizar o seguinte workflow:
“Mostrar um formulário HTML, forçar uma pré-visualização, somente então fazer algo com o enviado.”
Para forçar uma pré-visualização de um envio de formulário, todos devem escrever uma pequena classe Python.
Dada uma subclasse de django.forms.Form que você define, esta aplicação se preocupa com o seguinte fluxo:
O framework fiscaliza a pré-visualização requisitada passando um hash de segredo compartilhado para a página de pré-visualização, por meio de campos hidden. Se alguém ajusta os parâmetros do formulário na página de pré-visualização, o envio do formulário pode falhar no momento da comparação com o hash.
Aponte o Django para os templates padrão do FormPreview. Existem duas maneiras de fazer isso:
Crie uma subclasse FormPreview que sobrescreva o método done():
from django.contrib.formtools.preview import FormPreview
from myapp.models import SomeModel
class SomeModelFormPreview(FormPreview):
def done(self, request, cleaned_data):
# Faça algo com o cleaned_data, e depois redirecione
# para uma página de "sucesso".
return HttpResponseRedirect('/form/success')
Este método recebe um objeto HttpRequest e um dicionário de dados de formulário, depois de terem sido validados e limpos. Podendo retornar um HttpResponseRedirect, que é um resultado final de um fomulário que foi enviado.
Mude seu URLconf para apontar para uma instância de sua subclasse FormPreview
from myapp.preview import SomeModelFormPreview from myapp.models import SomeModel from django import forms
...e adicione a seguinte linha para o modelo apropriado em seu URLconf:
(r'^post/$', SomeModelFormPreview(SomeModelForm)),
onde SomeModelForm é uma classe Form ou ModelForm.
Rode o servidor do Django e visite /post/ no seu navegador.
Uma classe FormPreview é uma simples classe Python que representa o fluxo da pré-visualização. As classes FormPreview devem ser subclasses de django.contrib.formtools.preview.FormPreview e sobrescrever o método done(). Elas podem ficar em qualquer parte da base de código.
Por padrão, o formulário é renderizado por meio do template formtools/form.html, e a página de previsão é renderizada por meio do template formtools.preview.html. Esses valores podem ser sobrescritos por um formulário de pré-visualização configurando os atributos preview_template e form_template na subclasse FormPreview. Veja django/contrib/formtools/templates para conhecer os templates padrões.
Dec 26, 2011