Django多页面形式

时间:2011-04-26 19:19:58

标签: django forms django-forms

请帮我解决问题:) 我有三个型号:

# 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模型创建两步形式:
第一页 - 选择流派
第2页 - 标题并与所选类型相关作者

如果没有ajax和javascript我怎么能这样做?

3 个答案:

答案 0 :(得分:4)

我在Django和其他环境中做过这个。我最近完成它的方式是:只需要绝对最小的字段数。在表格的第一页上收集这些内容。当用户提交时(我建议在重定向上发布),将它们存储在数据库中,然后在第二个表单上显示其余字段。

我在注册表中使用它。第一步创建帐户。长注册表会阻止用户。如果他们没有完成第2步,那就不会丢失。我知道他们是谁,他们可以在以后完成其余的工作。如果他们完成了第2步,那么我会进行更新并添加其他非必填字段。 (哦,并且“不需要”我的意思是db允许null)

我不建议的另一个选项是将变量存储在会话中。这样做的问题是,有时会话在用户完成表单之前超时。嘘声。

比这更好的方法是将第一步中的字段保留在第二种形式的隐藏字段中。

在后两种情况下,如果用户离开你什么都没有。也许你的用例没问题。

答案 1 :(得分:0)

您可以使用FormWizard。 Django Docs上非常清楚地解释了实施说明。

总而言之,您首先要创建代表每个步骤的表单。在您的情况下,ModelFormGenre模型可能为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])),
)

答案 2 :(得分:0)

我非常高兴第二个newz2000方法而不是formWizard。最重要的原因是,正如newz2000所说的那样,如果他们在多步骤的最后一个表格中搞砸了,不要丢失用户已经填写的关键信息。

其次,你不需要沉迷于形式魔法的额外复杂性,当它无法为你节省太多时 - 你仍然必须定义单个表单,处理所有字段并具有多个表单向导的模板。

第三,您可以使用fields.keyorder来使用模型表单来显示每个表单中的字段(确保在存在时始终发送实例)。

我看到newz2000方法的唯一缺点,如果你甚至可以称之为,那就是你不能在模型级强制执行后面步骤中的那些字段的强制字段他们需要在表单层面完成。

错误的另一个可能性(但这很容易处理)是,如果您的模型对象的应用程序逻辑依赖于可能未填充的其他强制类型字段,但您应该检查这些字段的空条件无论如何在操作它们之前的视图/功能中。我们甚至可以添加一个" status_complete"对于为多表单完成的步骤级别存储1,2,3等值的模型类型字段。然后,可以将其用于条件代码分支,以便向用户建议表单完成提醒或根据需要建议清理操作。