Pré-visualização de formulários¶
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.
Visão Geral¶
Dada uma subclasse de django.forms.Form
que você define, esta aplicação
se preocupa com o seguinte fluxo:
- Mostrar o formulário como uma página HTML.
- Validar os dados do formulário quando este é enviado via POST. a. Se for válido, mostra uma pré-visualização da página. b. Se não for válido, mostra novamente o formulário com as mensagens de erro.
- Quando a “confirmação” do formulário é submetida da página de previsão,
chame um hook que você define – um método
done()
que captura os dados válidos passados.
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.
Como usar o FormPreview
¶
Aponte o Django para os templates padrão do
FormPreview
. Existem duas maneiras de fazer isso:- Adicione
'django.contrib.formtools'
em seuINSTALLED_APPS
. Isso funcionará se o seuTEMPLATE_LOADERS
incluir o carregador de templates (que vem por padrão)app_directories
. Veja a documentação do carregador de templates para saber mais. - De outra maneira, determine o caminho completo no sistema de arquivos
para o diretório
django/contrib/formtools/templates
e adicione-o noTEMPLATE_DIRS
no arquivo settings.py.
- Adicione
Crie uma subclasse
FormPreview
que sobrescreva o métododone()
: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 umHttpResponseRedirect
, 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.
Classes FormPreview
¶
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.
Templates FormPreview
¶
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.