我想实现类似于Django inlineformsets的自己的功能。我感兴趣的是Django如何处理主要对象的验证和保存以及内联表单中的相关对象。
我们说我有两个模型:Blog
和Entry
。 Entry
具有非Blog
的外键。我希望能够在一个地方创建博客和它的条目。这就是我使用Django内联表单的方式:
blogform = BlogForm(request.POST)
if blogform.is_valid():
tmp = blogform.save(commit=False)
entriesform = EntryInlineFormset(request.POST, instance=tmp)
if entriesform.is_valid():
entriesform.save()
blog.save()
这里引人入胜的是什么?如果没有将博客保存到数据库中,Django如何验证条目?我想在Django代码中找到它,但我无法找到实际执行此操作的地方。
我的好处是他们创造了一个交易。他们保存博客表单,如果entriesform无效,则回滚。但是如果entriesform有效,接下来呢?博客实例是否保存?如果save
永远不会被调用怎么办?
或者他们是否通过两种方法(is_valid
和save
)跨越交易?我不认为以一种方法启动交易并以另一种方式结束交易是最佳做法。
答案 0 :(得分:1)
您可以在调用save之前验证它们。您可以将空白实例传递到父窗体和formset中。
blog = Blog()
blogform = BlogForm(request.POST, instance=blog)
entriesform = EntryInlineFormset(request.POST, instance=blog)
blog_valid = BlogForm.is_valid()
entries_valid = entriesform.is_valid()
if blog_valid and entries_valid:
... save ...
我单独验证表单并将结果保存到变量中以避免短路。