如何使按钮单击更新数据库并重定向到 Django 中的视图?

Posted

技术标签:

【中文标题】如何使按钮单击更新数据库并重定向到 Django 中的视图?【英文标题】:How to make a button click update the database and redirect to a view in Django? 【发布时间】:2018-04-03 05:01:06 【问题描述】:

我已经为此苦苦挣扎了一段时间,任何帮助将不胜感激!

基本上,我想要做的是单击 Django 中的一个 html 按钮,更改数据库中的一个字段(具有相关主键的对象),然后重定向回主页。

一个清晰的例子:

目前,我正在使用网址:http://127.0.0.1:8000/result/edit/1/。 /1/ 是我要更改的模型的主键。该模型是一个自定义组模型,具有一个名为“状态”的字段。状态可以是“已批准”或“未批准”:

status = models.CharField(max_length=30, default=Status.not_sent, choices=Status.choices(), null=False)

在 url result/edit/1/ 我有一个“批准”按钮。当我单击按钮时,我想更改模型中的状态,并将其保存在数据库中。另外,在更改状态后,我想重定向回家。我在视图中编写了以下方法来做到这一点:

def approve_group(request, pk):
    group = Group.objects.filter(pk=pk)
    group.status = Status.approved
    group.save()

    return redirect(request, 'home')

在 html 中,我创建了以下按钮:

<a href="% url 'resultregistration:approve_group' %" />
    <button id="approve-btn" />Approve</button>
</a>

我的理由是按钮应该调用这个 URL,它应该再次调用视图中的函数:

url(r'^result/approve/(?P<pk>\d+)/$', views.approve_group, name 
='approve_group'),

不幸的是,这只给出了 NoReverseMatch 错误,我不知道如何继续。

感谢您的宝贵时间!

【问题讨论】:

阅读这个answer,因为你需要使用ajax调用 【参考方案1】:

这里缺少的是 url 的 pk。所以你也需要填写它才能生成反向。您可以在 django docs 中阅读更多相关信息

<a href="% url 'resultregistration:approve_group' pk=my_pk %" />
    <button id="approve-btn" />Approve</button>
</a>

【讨论】:

虽然上面的答案是正确的,但我还是建议不要使用 GET 请求来更改数据库。适合初学者,但从长远来看,您希望将表单添加到 HTML 文件并发布批准状态。只有当它是 POST 请求时,您的视图才应该进行更改。 dirkgroten 的妙语。 不不不,他应该使用ajax调用不需要重定向用户 感谢您的回答!不幸的是,我仍然遇到同样的错误:“Reverse for 'approve_group' with keyword arguments ''pk': ''' not found.” 我尝试编写 pk=Group.pk,但这可能是错误的! 哪个视图使用按钮呈现 HTML?该视图必须将pk 作为上下文变量传递给模板渲染。【参考方案2】:

您的观点似乎有误。它不能是过滤器,因为它返回一个查询集,它必须是一个 get 查询,因为它返回有问题的对象:

def approve_group(request, pk):
    group = Group.objects.get(pk=pk)
    group.status = Status.approved
    group.save()
    return redirect(request, 'home')

而且我认为使用 POST 请求在 Jquery 中进行更改会更好。也许是这样的:

<form action="% url 'resultregistration:approve_group' pk=my_pk %" method=POST>
<button id="approve-btn" type="submit">Approve</button>
</form>

通过这样做,一个 POST 请求被发送到视图,作为回报,可以重定向到主页。请确认命名空间(resultregistration)是否正确。

【讨论】:

以上是关于如何使按钮单击更新数据库并重定向到 Django 中的视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭弹出窗口并重定向到Django View中的另一个页面?

更新数据库记录并重定向到不同页面的动态操作

单击按钮时弹出关闭并重定向到不同的页面!

如何打开新选项卡并重定向到链接 EXT JS portlet 按钮

单击注销按钮终止会话并重定向到登录页面

Django中相同形式的两个不同提交按钮