【问题标题】:Can I use standard generic CreateView for model formset?我可以将标准通用 CreateView 用于模型表单集吗?
【发布时间】:2022-01-01 17:38:16
【问题描述】:

我再次陷入模型表单集。我有以下表格:

ArticleFormSet = modelformset_factory(Article, fields=('title', 'pub_date'), extra=3)

这个模型表单集的视图:

class ArticleCreateView(CreateView):
   model = Article
   form_class = ArticleFormSet
   template_name = 'article_form_view.html'
   success_url = "/"

在此处阅读文档:https://docs.djangoproject.com/en/4.0/topics/forms/modelforms/#model-formsets 我明白了,我可以使用 ArticleFormSet 而不是 form_class 属性的标准形式。

所以基本上,我所期望的是,这应该为同一个文章模型显示 3 个表单,并且我应该能够同时创建三篇文章。

但我收到“TypeError: init() got an unexpected keyword argument 'instance' ”。

所以问题是,这是它应该如何工作的吗?或者同时创建几篇文章的正确方法是什么?

【问题讨论】:

  • 您能否指定遇到错误时您正在做什么并提供完整的错误回溯?
  • 其实我在做什么在这里并不重要。我想要的只是在基于通用类的视图中显示模型表单集,在这种特殊情况下为 CreateView。我的意思是甚至可以将模型表单集与 CBV 一起使用吗?

标签: django django-forms formset


【解决方案1】:

我不认为通用CreateView 默认能够处理表单集;但是,自定义视图应该更容易,使其按您的意愿工作。

据我所知,当视图尝试创建要呈现的表单时会引发异常。所以需要重写get_form 方法:

class ArticleCreateView(CreateView):

...

   def get_form(self):
        if self.request.method == 'POST':
            return self.form_class(self.request.POST)

        return self.form_class()

该方法要么返回工厂创建的模型表单集(在调用表单集的情况下),要么用您发布的数据填充它。

另一个问题似乎是success_url。使用表单集时会出现异常。因此,您还需要覆盖该方法,例如

...
    def get_success_url(self):
        return self.success_url 

现在应该可以了。

但是:如果我理解正确,您希望视图用于创建新数据。 ``modelformset_factory``` 获取所有模型实例并附加 3 个空表单。这可能不是你想要的。为了获得一个空的表单集,请查看此 SO 帖子:

Empty ModelFormset in Django's FormWizard

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2013-04-06
    • 2011-12-28
    • 2014-09-20
    • 1970-01-01
    • 2015-01-10
    • 2012-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多