Django ModelForm,有一个外键作为隐藏字段

2024-06-09 06:09:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我基本上在构建一个非常简单的表单。让我们继续使用django教程中给出的图书/出版商示例,并在此基础上进行构建。在

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

当用户提交一个HTTP帖子时,我会做如下操作:

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

是的,这里做了一些幼稚的事情,比如盲目地获取发布者的id并验证它是否是真实的publisher id,以及其他安全问题。我们暂时不去注意这个问题。在

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

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

另外,有没有可能把发布者嵌入到一个隐藏的字段中,这样我就不需要这样做了mybookform.save(commit=False)只需做mybookform=BookForm(请求.POST)其次是mybookform.save()马上?在


Tags: 用户id数据库false应用程序表单requestsave
2条回答

没有比这更好的方法了。在

为此,我将使用get_object_or_404函数。在

是的,您可以通过将model字段设置为editable=False来防止用户修改它

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

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

相关问题 更多 >