Django ModelForm,将外键作为隐藏字段

时间:2009-11-30 00:25:40

标签: python django

我基本上构建了一个非常简单的形式。让我们坚持使用django教程中给出的书籍/出版商示例,并在此基础上进行构建。

我有一个用户登录到Web应用程序,此时他们可以做的第一件事就是点击发布者。然后,此发布者将保存其会话。在那之后,我把他们带到一个创建书形式。在那里,我将发布者的id从数据库嵌入到隐藏字段中。

用户提交HTTP POST后,我会执行以下操作:

mybookform = BookForm(request.POST)
if mybookform.is_valid():
    abook = mybookform.save(commit=False)
    abook.publisher_id = request.POST['publisher_id']
    mybookform.save()

是的,这里有一些天真的事情,例如盲目地抓住publisher_id并验证它是否确实是真正的发布者ID,以及其他安全问题。我们暂时不要注意这一点。

我的问题是,有更好的方法来处理这个问题吗?虽然假设这个例子没有逻辑意义,但在我的特定应用中,这个例子实际上是有道理的。问题是我得到一个ValueError异常,说publisher_id需要是Publisher实例。

现在,我可以使用Publisher.objects.filter(id = ..)轻松检索发布者实例,并使用它。问题是,这真的有必要吗?我可以避免对数据库的额外查询,并以某种更“优雅”的方式更新此表单实例吗?

此外,是否有可能以某种方式将发布者嵌入隐藏字段中,这样我就不需要执行mybookform.save(commit = False),只需执行mybookform = BookForm(request.POST),然后执行mybookform.save( )马上?

2 个答案:

答案 0 :(得分:1)

检索发布者的实例确实可以防止可能引用完全无效的发布者的客户端更改。

对于您的第二个问题,是的,您可以将该字段作为隐藏字段包含在overriding the field in the ModelForm中,并将widget设置为HiddenInput的适当表单字段。

答案 1 :(得分:1)

没有更好的方法可以做到这一点。

我会使用get_object_or_404函数。

是的,您可以通过将模型字段设置为editable=False来阻止用户修改此项,