Предварительный просмотр форм

Django поставляется с приложением «предварительный просмотр форм», которое может помочь автоматизировать следующую последовательность действий:

«Отобразить форму, обеспечить предварительный просмотр формы, затем что-нибудь сделать при отправке данных.»

Для того, чтобы обеспечить предварительный показ формы, вам понадобится написать короткий класс.

Введение

Используя вашу реализацию класса django.forms.Form, это приложение обеспечит следующее:

  1. Отображение формы на странице.

  2. Проверяет данные формы, при её отправке через POST. а) Если данные прошли проверку, отображает страницы для предварительного просмотра. б) Если данные не прошли проверку, заново отображает форму, показав сообщения об ошибках.

  3. При подтверждении отправки данных на странице предварительного просмотра, вызывает ваш обработчик (метод done()), который получает правильные данные.

Django обеспечивает работу предварительного просмотра с помощью добавления секретного хэша в скрытые поля формы. Если кто-нибудь поменяет параметры формы на странице предварительного просмотра, то проверка секретного хэша выявит это.

Как использовать FormPreview

  1. Укажите Django стандартные шаблоны для предварительного просмотра. Есть два способа сделать это:

    • Добавьте 'django.contrib.formtools' в параметр конфигурации INSTALLED_APPS . Этот способ будет работать, если параметр конфигурации TEMPLATE_LOADERS содержит загрузчик шаблонов из каталогов app_directories (по умолчанию, загрузчик там прописан). Обратитесь к документации на загрузчик шаблонов для подробностей.

    • В другом случае, определите путь на файловой системе до каталога django/contrib/formtools/templates и пропишите его в параметр конфигурации TEMPLATE_DIRS.

  2. Унаследуйте класс FormPreview и переопределите метод done():

    from django.contrib.formtools.preview import FormPreview
    from django.http import HttpResponseRedirect
    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, который является результатом отправки формы.

  3. Измените настройку URL так, чтобы она указывала на созданный вами экземпляр потомка класса FormPreview:

    from myapp.preview import SomeModelFormPreview
    from myapp.forms import SomeModelForm
    from django import forms
    

    ... и добавьте следующую строку в соответствующее место списка URL:

    (r'^post/$', SomeModelFormPreview(SomeModelForm)),
    

    где SomeModelForm является классом Form или ModelForm для модели.

  4. Запустите сервер Django, откройте браузер и посетите страницу /post/.

Классы FormPreview

class FormPreview

Класс FormPreview — это обычный класс языка Python, который реализует функционал предварительного просмотра. Для использования данного функционала следует унаследовать этот класс и переопределить метод done(). Наследники этого класса могут располагаться в любом месте вашего кода.

Шаблоны FormPreview

FormPreview.form_template
FormPreview.preview_template

По умолчанию форма отображается через шаблон formtools/form.html, а страница предварительного просмотра отображается через formtools/preview.html. Это поведение можно изменить для определённой формы с помощью атрибутов preview_template и form_template класса FormPreview. Загляните в каталог django/contrib/formtools/templates.

Дополнительные методы FormPreview

FormPreview.process_preview()

Получив проверенную форму, выполняет дополнительную обработку перед отображением страницы предварительного просмотра, сохраняя все новые данные в контексте.

Про умолчанию этот метод пуст. Он вызывается после проверки формы, но перед тем как в контекст будет добавлен хэш и страница будет сгенерирована.