为什么网站没有收到POST请求?

时间:2017-05-14 06:27:25

标签: javascript python html django

我一直在尝试创建重新加载按钮,一旦点击,就会提交javascript表单的支持:

<div style="float: left;width:100%;height: 8%;background-color: #333333;min-height: 60px;">
    <form id="rel_inv" name="reload_inventory" action="/account/" method="post">
    {% csrf_token %}
    <input type="submit" name="reloadinv" value="inventory_reload" style="display: none;"></input>
    <div onclick="javascript:document.getElementById('rel_inv').submit();" name="reload_inv" style="width: 60px;height: 60px;cursor: pointer;text-decoration:none;display: block;"><img src="/static/Home/images/reload_i.png" style="width: 30px;height: 30px;margin-top: 25%;margin-left: 25%;"></div>
</div>

单击div时,页面会重新加载,但是我仍然没有在views.py中收到任何POST请求 -

reload_inventory = "false"
if request.method == 'POST':
    print("request has been received")
    if request.POST.get("reloadinv"):
        reload_inventory = "true"

reload_inventory变量通过上下文发送到模板。为了在发送POST请求后检查变量是否被更改,我向<script> -

添加了警报
alert("{{ reload_inventory }}")

脚本始终警告“false”,并且在提交表单时request.method从未POST过...

最终目标是使用{{ reload_inventory }}变量来获取用户是否请求重新加载库存。如果{{ reload_inventory }}"true",则会调用广告资源功能,并自动打开用户的广告资源。

更简单地说,一旦用户点击重新加载按钮,页面就会重新加载新变量reload_inventory。如果reload_inventory为“true”,则会通过javascript打开“库存”菜单,如果不是,则反之亦然。

那么问题是什么呢?是否有理由为什么即使提交表单,request.method也不等于POST?有没有更好的方法呢?我的代码有问题吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

问题出在这一行:

if request.POST.get("reload_inv"):

POST字典不包含此类值。您可以在print(request.POST)之后加print("request has been received")并查看。

相反,所有POST键值对都填充了表单数据(而不是javasciript)。 reload_inv变量是div<div onclick="javascript:document.getElementById('rel_inv').submit();" name="reload_inv">...</div>)的名称,实际上它不是有效的HTML。

要开始工作,请将if request.POST.get("reload_inv"):更改为:

if request.POST.get("reloadinv"):

这是input<input type="submit" name="reloadinv" value="inventory_reload" ...>

的名称

[编辑]:此外,当您使用其他元素(<input type="submit">)提交表单时,没有必要使用div。而是从以下位置更改此输入:

<input type="submit" name="reloadinv" value="inventory_reload" style="display: none;"></input>

为:

<input type="hidden" name="reloadinv" value="inventory_reload">

我在本地进行了测试,效果很好。