【问题标题】:How to pass arguments from javascript to django view?如何将参数从 javascript 传递到 django 视图?
【发布时间】:2019-08-25 03:52:11
【问题描述】:

我正在尝试用简单的计算器来做页面。我在 js 中制作了计算器,现在,当我单击按钮时,我想将参数从 js 传递给 django。在那里计算它们并在重定向页面上打印。

重定向页面有问题。当我不在表单中放置按钮时,js 脚本调用计算视图,但不重定向页面。我想要重定向页面并在那里打印结果。

html代码:

<form action="calc/" method="post">
    {% csrf_token %}
    <input id='btn' type="submit" value="CALC" onclick="change()">
</form>

javascript代码:

function change(){
    var foo = 1;
    var foo1 = [1, "tralal", true, ''];

    $.ajax({

        url: 'calc/',
        data : {
            'foo': foo,
            'foo1': foo1,
        },
        success: function (data) {
            alert("it worked!");
        }
    }
)};

django 中的网址

path('calc/', views.calc, name='calc')

在 django 中查看

def calc(request):
    foo = request.GET.get('foo')
    print(foo)
    foo1 = request.GET.getlist('foo1[]')
    print(foo1)
    context = {'data': foo1}
    return render(request, 'calc.html', context)

【问题讨论】:

  • 警报是否“有效!”提交表单时弹出?
  • 不,当它在
    块中时它不会做任何事情。当我禁用
    它的工作,但不重定向页面到 '~/calc/'.

标签: javascript django


【解决方案1】:

如果您想重定向到另一个页面,您必须在调用成功回调时从 javascript 显式执行此操作。您可以看到here 一些关于如何从 javascript 重定向页面的答案。为此,您必须有另一个视图来提供结果页面。 计算结果可以保存在服务器中(缓存),也可以从客户端进行通信。

但是,我想知道您为什么要为此使用 Ajax 请求。如果您想在不刷新(或重定向)页面的情况下向服务器执行一些异步 http 请求,Ajax 请求非常有用。所以我想说,不要在这里使用 Ajax 请求,只需提交表单即可。您可以查看例如 here 以了解表单在 javascript 中的工作方式。您也可以查看Django tutorial 关于使用表格的信息。 Django 有一些处理表单的工具,例如当您想在数据库模型中更新或创建新实例时非常方便。一开始可能会有点混乱,但我认为值得花一些时间了解 Django 表单。

【讨论】:

  • 嘿,我尝试使用 window.location.href = "127.0.0.1:8000/calc";在 js 中,但这并不能解决问题,因为它启动了 2 次计算视图。首先没有来自 js 的参数(重定向到 ~/calc/)第二个传递参数,但没有页面刷新(来自 ajax)。我不能在那里使用表格。我在帖子中写道,我想创建一个简单的计算器,但这会传递事实。这是一个计算器,它将用户的绘图转换为一个矩阵,我可以在该矩阵上执行操作并在新的重定向页面上返回结果。
【解决方案2】:

我做了这样的事情,它有效,但我不知道它是否正确。

views.py

def link(request):
    global matrix
    matrix = request.GET.getlist('foo1[]')
    return HttpResponseRedirect('/calc/')


def calc(request):
    if request.is_ajax:
        global matrix
        context = {'data': matrix}
        return render(request, 'calc.html', context)
    else:
        return HttpResponseRedirect('/')

urls.py

path('link/', views.link, name='link'),
path('calc/', views.calc, name='calc'),

js函数

$(document).ready(function() {
$("#btn").click(function(e) {
    var foo = 1;
    var foo1 = [1, "tralal", true, ''];

    $.ajax({
        url: 'link/',
        data : {
            'foo': foo,
            'foo1': foo1,
        },
        success: function (data) {
             window.location.href = "calc/"
        }
    });
});
});

html代码

<input id='btn' type="submit" value="COUNT">

计算.html

{% for d in data %}
    <p>"{{ d }}"</p>
{% endfor %}

页面重定向到 calc/ 并显示正确的非无矩阵。 Result

【讨论】:

    【解决方案3】:

    使用 window.location.href = "127.0.0.1:8000/calc" 得到的结果是正常的。您只是在没有任何 url 查询参数的情况下重定向到同一页面。

    那么,您基本上是想重定向到同一页面? 那你为什么要重定向?这对我来说没有多大意义。同样,如果您想重定向,请不要使用 AJAX,并按照“正常”的方式提交表单。

    所以我认为更有意义的是,不要重定向,而是使用您从 AJAX 请求收到的数据并显示信息。您仍然可以使用一些 Django 诱人的方法并返回一些渲染的 HTML,然后您将使用一些 Javascript 代码动态添加这些 HTML。

    可能是这样的:

    Javascript

    $.ajax({
        url: 'link/',
        data : {
            'foo': foo,
            'foo1': foo1,
        },
        success: function (data) {
             $('#result-container').html(data)  // add the data in the div container
             $("#your-form").trigger('reset'); //you should reset your form
        }
    });
    

    “/”处的主 HTML 应包含

    <div id="result-container"></div>
    

    你应该摆脱你的链接视图,让另一个像那样

    def calc(request):
        if request.is_ajax:
            matrix = request.GET.getlist('foo1[]')
            context = {'data': matrix}
            return render(request, 'calc.html', context)
    

    但我再次告诉你,你应该使用 Django 表单来完成你的工作。例如,请参阅this tutorial。

    希望对你有帮助。

    【讨论】:

    • 我在主页 127.0.0.1:8000/ 然后我单击按钮和 js 将数据发送到 django、django math 并在 127.0.0.1:8000/calc/ 页面上显示结果。 imgur.com/a/ZMa0UIL
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2016-08-08
    相关资源
    最近更新 更多