Django поставляется с приложением «предварительный просмотр форм», которое может помочь автоматизировать следующую последовательность действий:
«Отобразить форму, обеспечить предварительный просмотр формы, затем что-нибудь сделать при отправке данных.»
Для того, чтобы обеспечить предварительный показ формы, вам понадобится написать короткий класс.
Используя вашу реализацию класса django.forms.Form, это приложение обеспечит следующее:
Отображение формы на странице.
Проверяет данные формы, при её отправке через POST. а) Если данные прошли проверку, отображает страницы для предварительного просмотра. б) Если данные не прошли проверку, заново отображает форму, показав сообщения об ошибках.
При подтверждении отправки данных на странице предварительного просмотра, вызывает ваш обработчик (метод done()), который получает правильные данные.
Django обеспечивает работу предварительного просмотра с помощью добавления секретного хэша в скрытые поля формы. Если кто-нибудь поменяет параметры формы на странице предварительного просмотра, то проверка секретного хэша выявит это.
Укажите Django стандартные шаблоны для предварительного просмотра. Есть два способа сделать это:
Добавьте 'django.contrib.formtools' в параметр конфигурации INSTALLED_APPS . Этот способ будет работать, если параметр конфигурации TEMPLATE_LOADERS содержит загрузчик шаблонов из каталогов app_directories (по умолчанию, загрузчик там прописан). Обратитесь к документации на загрузчик шаблонов для подробностей.
В другом случае, определите путь на файловой системе до каталога django/contrib/formtools/templates и пропишите его в параметр конфигурации TEMPLATE_DIRS.
Унаследуйте класс FormPreview и переопределите метод done():
from django.contrib.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')
Этот метод принимает объект HttpRequest и словарь с данными формы, после их проверки и нормализации. Метод должен возвращать экземпляр HttpResponseRedirect, который является результатом отправки формы.
Измените настройку URL так, чтобы она указывала на созданный вами экземпляр потомка класса FormPreview:
from myapp.preview import SomeModelFormPreview
from myapp.forms import SomeModelForm
from django import forms
... и добавьте следующую строку в соответствующее место списка URL:
(r'^post/$', SomeModelFormPreview(SomeModelForm)),
где SomeModelForm является классом Form или ModelForm для модели.
Запустите сервер Django, откройте браузер и посетите страницу /post/.
Класс FormPreview — это обычный класс языка Python, который реализует функционал предварительного просмотра. Для использования данного функционала следует уналедовать этот класс и переопределить метод done(). Наследники этого класса могут располагаться в любом месте вашего кода.
По умолчанию форма отображается через шаблон formtools/form.html, а страница предварительного просмотра отображается через formtools/preview.html. Это поведение можно изменить для определённой формы с помощью атрибутов preview_template и form_template класса FormPreview. Загляните в каталог django/contrib/formtools/templates.
Получив проверенную форму, выполняет дополнительную обработку перед отображением страницы предварительного просмотра, сохраняя все новые данные в контексте.
Про умолчанию этот метод пуст. Он вызывается после проверки формы, но перед тем как в контекст будет добавлен хэш и страница будет сгенерирована.
Mar 30, 2016