Django 的 FormWizard 中的空 ModelFormset

Posted

技术标签:

【中文标题】Django 的 FormWizard 中的空 ModelFormset【英文标题】:Empty ModelFormset in Django's FormWizard 【发布时间】:2012-01-09 02:39:07 【问题描述】:

我正在使用 Django 的 FormWizard。它工作正常,但我无法正确显示任何空模型表单集。

我有一个名为Domain 的模型。我正在创建这样的 ModelFormset:

DomainFormset = modelformset_factory(Domain)

我像这样将它传递给 FormWizard:

BuyNowWizardView.as_view([DomainFormset])

我没有收到任何错误,但是当向导呈现页面时,我得到了所有 Domain 对象的列表。我想要一个空的表格。我怎么能做到这一点?我已经读到我可以为 ModelFormset 提供一个 queryset 参数,例如 Domain.objects.none(),但由于出现错误,它似乎不起作用。

关于我哪里出错了有什么想法吗?

谢谢

【问题讨论】:

设置查询集时遇到什么错误? 【参考方案1】:

Django 文档为change the queryset for a formset 提供了两种方法。

第一种方法是在实例化表单集时将查询集作为参数传递。使用表单向导,您可以通过传递 instance_dict

来做到这一点
# set the queryset for step '0' of the formset
instance_dict = '0': Domain.objects.none()

# in your url patterns
url(r'^$', BuyNowWizardView.as_view([UserFormSet], instance_dict=instance_dict)),

第二种方法是继承BaseModelFormSet 并覆盖__init__ 方法以使用空查询集。

from django.forms.models import BaseModelFormSet

class BaseDomainFormSet(BaseModelFormSet):
    def __init__(self, *args, **kwargs):
        super(BaseDomainFormSet, self).__init__(*args, **kwargs)
        self.queryset = Domain.objects.none()

DomainFormSet = modelformset_factory(Domain, formset=BaseDomainFormSet)

然后像以前一样将DomainFormSet 传递给表单向导。

【讨论】:

嘿 Alasdair,我已经尝试了你提到的方法,但我仍然得到填写数据的表单字段。我想知道这是否是一个错误。与常规表单向导的唯一区别是我使用的是 Django 1.4 中较新的向导,该向导已向后移植到 DJango 1.3 github.com/stephrdev/django-formwizard 你说的填写是什么意思?它是显示数据库中的现有域,还是仅使用initial 数据预先填写表单? 是的,它正在显示数据库中的所有现有域。我为每个 Domain 记录获得一个表格,其中包含值。 嗯。我做了一个测试项目(Django trunk,1.4 pre-alpha),子类化方法也不适用于我。我已经用instance_dict 方法更新了我的答案,这确实对我有用。

以上是关于Django 的 FormWizard 中的空 ModelFormset的主要内容,如果未能解决你的问题,请参考以下文章

使用 formwizard-django 创建用户后登录

带有动态表单的 Django FormWizard

编辑时的 Django FormWizard 预填充

django manytomany 字段使用 through 和 formwizard

带有模板的自定义 Django FormWizard 步骤

Django formwizard 与表单集和表单在同一页面上