【问题标题】:Ajax Post in Django framework?Django框架中的Ajax Post?
【发布时间】:2011-07-15 08:10:45
【问题描述】:

我在 django 框架中对 ajax/jquery 帖子进行了简单的测试,但并不真正理解为什么输出没有进入模板页面。有人吗?

我可以在 firebug 的“响应”选项卡中看到帖子的内容,但是无论我尝试返回模板还是简单消息,浏览器本身都没有任何反应。相反,非 ajax 帖子按预期工作(加载新页面、发布消息)

我是 ajax/jquery/django 的新手,所以请原谅我的无知 :)

最终,我希望能够通过 jquery 将任意非表单变量传递给 django 视图。可能的?谢谢你:)

这是代码--

test.html:

<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script></javascript>
<script type="text/javascript">
   $(document).ready(function() {
       $("#testForm").submit(function(event){
           event.preventDefault();
           $.ajax({
                type:"POST",
                url:"/test_results/"
                    });
       });
       return false;
    });
</script>
</head>
<body>
        <form id="testForm" action="/test_results/" method="post">
            <input type="submit" id="go" name="go" value="Go!">
        </form>
</body>
</html>

views.py:

from django.shortcuts import render_to_response
from django.http import HttpResponse


    def test_ajax(request):
        if request.is_ajax():
            message = "Yes, AJAX!"
        else:
            message = "Not Ajax"
        return HttpResponse(message)
        #alternative test: return render_to_response('test_results.html')

urls.py:

(r'^test_results/$', views.test_ajax),
(r'^test/$', views.test),

还有几乎是空的 test_results.html:

<html>
<head>
</head>
<body>
test results
</body>
</html>

【问题讨论】:

  • 请注意,您的return false 级别错误;它应该在$("#testForm").submit 块内,即高一行,所以它在该块的关闭}); 之前。

标签: jquery ajax django


【解决方案1】:

我可以看到帖子的内容 firebug 的“响应”选项卡,但是否 我尝试返回一个模板或一个简单的 消息,没有任何反应 浏览器本身。相反,非 ajax 帖子按预期工作(加载新的 页面,发布消息)

如果您收到回复,您就会收到回复。你只是没有用它做任何事情。

为什么不提醒数据并将其附加到&lt;body&gt; 例如:

$.ajax({
     type:"POST",
     url:"/test_results/",
     data: {
            'arbitrary-data': 'this is arbitrary data',
            'some-form-field': $("myform input:first").val(), // from form
            'background-color': $("body").css("background-color")
            // all of this data is submitted via POST to your view.
            // in django, request.POST['background-color'] 
     },
     success: function(data){
         alert(data);
         $("body").append(data);
     }
});

【讨论】:

  • Yuji - 你的例子效果很好。我想我只是想让结果显示在“新”页面上。我知道这在某种程度上违背了 ajax 的目的,但正如我在回应 Brandon 的建议时提到的那样——我试图了解“数据”如何从 ajax 传输到 django 视图并传输到新模板。跨度>
  • 如果你想要一个新页面,不要使用ajax。正常提交表单,生成的 HTML 将作为响应。如果您不想要新页面,请使用 ajax 并修改当前页面(如我的示例中所做的那样)或根本不修改!您可以在 Brandons 示例中看到他记录了响应 console.log()。你用它做什么取决于你。
  • 我明白,我只是想了解事物是如何“旅行”的;)我可以将不属于提交表单的变量存储在 ajax 帖子中吗?比如说,我想将模板背景颜色的值发送到 django 视图进行处理?
  • 当然,那个ajax函数是 javascript。除了您碰巧在&lt;html&gt; 表单提交事件上触发它之外,不涉及 HTML。例如,您可以在计时器上调用它!您发送的数据也是任意的。查看 $.ajax 文档:api.jquery.com/jQuery.ajax 您通过 data 参数发送数据。我会用一个例子更新我的帖子。
  • 太棒了!你太快了,裕子。哈哈。我敢肯定你是在睡梦中做的,但你让我很开心:) 再次感谢。
【解决方案2】:

您需要为视图返回的响应添加一个处理程序:

$.ajax({
    type:"POST",
    url:"/test_results/",
    dataType: "json",
    success: function(json)
    {
        //specifying a dataType of json makes jQuery pre-eval the response for us
        console.log(json.message);
    }
 });

您可能还想在视图中将响应编码为 JavaScript:

try:
    import json
except ImportError:
    import simplejson

def my_view(request):
    if request.is_ajax():
        return HttpResponse(json.dumps({'message' : 'awesome'},
            ensure_ascii=False), mimetype='application/javascript')

希望能帮到你!

【讨论】:

  • 谢谢,布兰登 - 你已经成功回答了我的下一个问题 - 哈哈 - json 如何融入整个事情 - 但我仍然感到困惑:你的代码显示的“真棒”在控制台中,但不在浏览器中。这是你想要的吗?我试图弄清楚往返可能是什么样子——将 ajax 发布到 django 视图中,并且该视图显示最初由 ajax 发布的变量。
  • 很高兴我能帮上忙。您如何处理返回的值取决于您的应用程序。例如,假设您要将返回的值附加到 DOM 的末尾。在 jQuery 中你可以这样做: $('body').append(json.message);
猜你喜欢
  • 2020-04-26
  • 2021-07-17
  • 2015-11-14
  • 1970-01-01
  • 2015-04-02
  • 2023-03-17
  • 2017-04-16
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多