在django文档中,有一个使用inlineformset_factory来编辑已创建对象的示例
https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#using-an-inline-formset-in-a-view
我改变了这个例子:
def manage_books(request):
author = Author()
BookInlineFormSet = inlineformset_factory(Author, Book, fields=('title',))
if request.method == "POST":
formset = BookInlineFormSet(request.POST, request.FILES, instance=author)
if formset.is_valid():
formset.save()
return HttpResponseRedirect(author.get_absolute_url())
else:
formset = BookInlineFormSet(instance=author)
return render_to_response("manage_books.html", {
"formset": formset,
})
使用上面的内容,它只渲染没有父模型的内联模型 .
使用inlineformset_factory创建一个新对象,比如作者,与多个图书相关联,这是什么方法?
使用django docs上面的Author Book模型的示例将很有帮助 . django docs仅提供了如何使用inlineformset_factory编辑已创建对象但未创建新对象的示例
4 回答
我一开始没有正确地阅读你的问题 . 您还需要呈现父模型的表单 . 我没有对此进行过测试,我已经完成了之前我所做过的事情以及之前关联的答案,但它应该可行 .
UPDATE
如果您同时使用视图并进行编辑,则应首先检查作者ID . 如果没有ID,它会将两个表单呈现为一个新实例,而使用ID它将用现有数据填充它们 . 然后你可以检查是否有POST请求 .
我已经使用Django基于类的视图完成了这项工作 .
这是我的方法:
models.py
forms.py
views.py
urls.py
manage_books.html
Notice:
这是一个使用
inlineformset_factory
功能和Django通用基于类的视图的简单可运行示例我正在安装
django-crispy-forms
已安装,并且已正确配置 .代码存储库托管在:https://bitbucket.org/slackmart/library_example
我知道显示解决方案的代码更多,但是开始使用Django基于类的视图非常棒 .
根据Onyeka提供的广泛助手,我发布了我的最终解决方案 .
下面我使用Django Docs中的Author和Book示例发布使用Django的inlineformset_factory的Add和Edit解决方案 .
首先,添加作者对象,附加3个额外的Book对象 .
显然,这进入你的 views.py
这部分进入你的 urls.py ,假设已导入视图,并且已经构造了urlpatterns .
现在到模板部分 . 编辑作者对象模板(edit_author.html)看起来像这样(没有应用样式)
要通过模板添加全新的作者对象(add_author.html):
注意:
使用action =' . '似乎是一种构建url的廉价方式,因此表单将表单数据发布到同一页面 . 在这个例子中,使用action =' . '对于edit_author.html模板,始终将表单发布到/ edit /而不是/ edit / 1或/ edit / 2
使用{%url 'edit_author' author_id%}构建网址可确保将表单 always 发布到正确的网址 . 没有使用{%url%}会花费我很多时间和麻烦 .
非常感谢Onyeka .
我做了你正在尝试的事情:https://github.com/yakoub/django_training/tree/master/article
您需要使用prefix属性创建单独的表单 . 然后当你保存时,你需要遍历所有书籍并将它们与你刚创建的作者联系起来 .