【问题标题】:POST vs GET method in Django's view functionDjango视图函数中的POST vs GET方法
【发布时间】:2018-03-16 06:32:51
【问题描述】:

我的应用的 urls.py 是:

from django.urls import path
from . import views

app_name = 'javascript'
urlpatterns = [
    path('create_table', views.create_table, name='create_table')

我的views.py是:

def create_table(request):
    if request.method == 'POST':
        row_data = "this is row data"
        context = {'row_data': row_data}
return render(request, 'javascript/create_table.html',context)

我的 create_table.html 是:

{% load static %}
<form action="" method="post">
    {% csrf_token %}
    <button id="create_table">Get data</button>
</form>
<div id="place_for_table"></div>
<script type="text/javascript">
    var row_data = "{{ row_data }}"
</script>
<script src="{% static 'javascript/scripts/create_table.js' %}"></script>

而我的 create_table.js 是:

function create_table() {
    document.getElementById("place_for_table").innerHTML = row_data;
}
document.getElementById("create_table").onclick = function() {
    create_table()
}

我想要实现的是:当/create table URL被请求时,只显示按钮。按下按钮时,row_data 变量的值会显示在按钮下方。

此时数据显示一眨眼就消失了。

我想我在视图函数中没有正确区分 POST 和 GET 方法。此外,我的逻辑基于默认情况下使用 GET 方法请求 URL 的假设。但是,如果我在视图的开头放置 print(request.method),它会打印 POST。

此外,每当我第一次加载页面或刷新页面时,我都会收到一条 Firefox 警告:“要显示此页面,Firefox 必须发送信息以重复之前的任何操作(例如搜索或订单确认)。较早执行。”

我尝试的其他方法是使用基于类的视图和 post 并获取 defs 或将 create_table 的 URL 放在 button formaction= 标记中,但这无济于事。

如果您对如何实现这一目标提出任何建议,我将不胜感激。

【问题讨论】:

  • 听起来您的按钮在运行create_table() 后可能正在提交表单。所以它运行create_table() 然后一秒钟后表单的发布导致您的浏览器得到响应并且整个页面被重新呈现。这可以解释为什么您会看到数据闪烁一瞬间,然后又消失了
  • 非常感谢,这很有道理。您知道如何防止按钮提交表单吗? (另外,即使它不是“提交”类型,它也正在提交一个表单,这不是很奇怪吗?)

标签: python django


【解决方案1】:

问题可能是因为当你是submitting 时它的表单refreshes/reloads 你的页面即/create_table url 因为哪个row_data resets

This 可能会帮助您理解为什么按钮提交,即使您没有明确向表单内的按钮提供type="submit"

我们的目标是防止事件发生。可以在我们的onclick 监听器中使用简单的return false 语句来完成,如下所示:

 function create_table() {
        document.getElementById("place_for_table").innerHTML = row_data;
 }   
 document.getElementById("create_table").onclick = function(event) {
        create_table();
        return false;
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多