django如何验证和保存inlineforms

时间:2014-04-11 09:28:27

标签: python django validation

我想实现类似于Django inlineformsets的自己的功能。我感兴趣的是Django如何处理主要对象的验证和保存以及内联表单中的相关对象。

我们说我有两个模型:BlogEntryEntry具有非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_validsave)跨越交易?我不认为以一种方法启动交易并以另一种方式结束交易是最佳做法。

1 个答案:

答案 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 ...

我单独验证表单并将结果保存到变量中以避免短路。