Django многостраничная форма - PullRequest
1 голос
/ 26 апреля 2011

Пожалуйста, помогите мне с моим вопросом :) У меня есть три модели:

# Genre model
class Genre(models.Model):
    title = models.CharField(...)

# Author model
class Author(models.Model):
    name = models.CharField(...)
    genre = models.ForeignKey(Author)

# Book model
class Book(models.Model):
    genre = models.ForeignKey(Genre)
    title = models.CharField(...)
    author = models.ForeignKey(Author)

Я хочу создать двухэтапную форму для модели Book:
1-я страница - выберите Жанр ,
2-я страница - название и связанный с ним жанр Автор

Как я могу сделать это без ajax и javascript?

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

Я делал это в Django и других средах.Самый последний способ, которым я это сделал, заключается в следующем: сделать только абсолютное минимальное количество обязательных полей.Соберите их на первой странице формы.Когда пользователь отправляет (я рекомендую опубликовать сообщение о переадресации), сохраните их в базе данных, а затем отобразите остальные поля во второй форме.

Я использую это в форме регистрации.Шаг первый создает учетную запись.Длинная форма регистрации отпугивает пользователей.Если они не выполнят шаг 2, это не страшно потеряно.Я знаю, кто они, и они могут завершить остальное позже.Если они выполнят шаг 2, тогда я сделаю обновление и добавлю дополнительные необязательные поля.(о, и под "не требуется" я подразумеваю, что БД допускает нулевое значение)

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

Лучший способ - сохранить поля с первого шага в скрытых полях во 2-й форме.

В обоих этих более поздних случаях, если пользователь уйдет, у вас ничего не будет.Может быть, это нормально с вашим вариантом использования.

0 голосов
/ 11 февраля 2015

Я очень второй метод newz2000 над formWizard. Самая важная причина, как сказал newz2000, заключается в том, чтобы не потерять критическую информацию пользователя, которую он уже заполнил, если он потерял, скажем, последнюю форму в многошаговой.

Во-вторых, вам не нужно баловаться дополнительной сложностью мастера форм, когда он все равно не сильно вас экономит - вам все равно нужно определить отдельные формы, обработать все поля и иметь несколько шаблонов для мастера форм.

В-третьих, у вас есть преимущество в том, что вы можете использовать форму модели с использованием fields.keyorder для представления полей в каждой форме (убедитесь, что вы всегда отправляете экземпляр, если он существует).

Единственный недостаток, который я вижу в методе newz2000, если вы даже можете его так назвать, это то, что вы не можете принудительно установить обязательное поле на уровне модели для тех полей, которые появляются на более поздних этапах, и они должны быть выполнены. на уровне формы.

Еще один потенциал для ошибки (но это легко обрабатывается), если логика вашего приложения для этого объекта модели имеет некоторую зависимость от других обязательных полей типа, которые могут быть оставлены незаполненными, но вы должны проверять нулевое условие в этих полях в любом случае в представлениях / функциях, прежде чем работать с ними. Мы даже можем добавить одно поле типа «status_complete» в модель, в которой хранятся такие значения, как 1, 2, 3 для уровней шагов, выполненных для мульти-формы. Затем его можно использовать для условного ветвления кода, чтобы предлагать пользователю напоминания о завершении формы или при необходимости выполнить очистку.

0 голосов
/ 01 апреля 2013

Вы можете использовать FormWizard для этого. Инструкции по реализации очень четко объяснены на Django Docs .

Подводя итог, вы начинаете с создания форм, представляющих каждый из ваших шагов. В вашем случае это может быть ModelForm s для ваших моделей Genre и Book. Затем определите подкласс WizardView, который определяет, как вы хотите обработать окончательные данные, используя метод done. Например:

from django.http import HttpResponseRedirect
from django.contrib.formtools.wizard.views import SessionWizardView

class BookWizardView(SessionWizardView):
    def done(self, form_list, **kwargs):
        create_book_form_data(form_list).save()
        return HttpResponseRedirect('/page-to-redirect-to-when-done/')

Затем вы создаете шаблон для форм в вашем мастере. Шаблон должен находиться в formtools/wizard/wizard_form.html, или в местоположении, к которому вы переопределили атрибут template_name, или в местоположении, возвращенном переопределенным методом get_template_names. Наконец, вы подключаете свое представление к URLconf, передавая фактический список классов форм, которые представляют шаги в вашем мастере:

from django.conf.urls import patterns

from myapp.forms import GenreForm, BookAuthorForm
from myapp.views import BookWizardView

urlpatterns = patterns('',
    (r'^contact/$', BookWizardView.as_view([GenreForm, BookAuthorForm])),
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...