【问题标题】:Django Ajax-jQueryDjango Ajax-jQuery
【发布时间】:2013-07-22 13:29:28
【问题描述】:

由于我对 Ajax 和 jQuery 比较陌生,并且很难做到这一点,所以我在这里发布。

Views.py

if request.is_ajax():
    if request.method == "POST":
        chatroom_id = request.POST['chatroom_id']
else:
    chatroom_id =''

print chatroom_id

当我删除 if request.is_ajax() 条件时,它会显示错误消息 Key 'chatroom_id' not found in <QueryDict: {u'reply': [u''], u'csrfmiddlewaretoken': [u'yIJct9O7WfyPnWmDosW9N5TEklRwoIHP']}>

Template.html

{% for key, values in chat_data.items %}
    <div class="container-fluid" alt = {{key}}>
        <div class="row-fluid">
           <div class="span2">
             {{values.from}} <br/> {{values.init_query}}
            </div>

        <div class="span10 well">

            {% for k in values.chat %}

                    <label> Text : {{k.text}} </label> 
                    <label> {{k.date_time}} </label>

            {% endfor %}        

        <form action = "#" method = "POST" id = {{key}} class="chatroom">
           {% csrf_token %}
               {{ form.as_p }}

            <input type="submit" value = "Sent" class="btn btn-primary"> 
        </form>

            </div>
        </div>
    </div>
{% endfor %}

由于会有很多聊天和相应的回复提交按钮及其密钥,我希望当我回复特定聊天时,它会随身携带密钥并相应地处理聊天。

如何使用 Django、jQuery 和 Ajax 实现这一目标?要发送的回复应该使用 jquery 通过 Ajax 给出

我已经编写了这些 jQuery 代码行,但它们似乎不起作用。我要去哪里

<script type="text/javascript">

var form = $('#'+'{{key}}');

form.submit(function (event) {
event.preventDefault();

$.ajax({
    type: "POST",
    url: "/dashboard",
    data : form.serialize(),
    success: function( response ) {
      console.log( response );
    }
});
return false;

});

【问题讨论】:

标签: ajax django jquery


【解决方案1】:

我认为最好的免费资源是 Mike Hibbert's video 关于使用 django 和 jquery 实现 ajax。

【讨论】:

    【解决方案2】:

    对于 jQuery,你有一些错误,帖子应该是这样的:

    var form = $('#'+'{{key}}');
    
    form.submit(function (event) {
        event.preventDefault();
    
        $.ajax({
            type: "POST",
            url: "/dashboard",
            data : form.serialize(),
            success: function( response ) {
              console.log( response );
            }
        });
        return false;
    });
    

    试试看,然后告诉我结果如何。

    【讨论】:

    • 我想告诉大家的是,在views.py 文件中,request.is_ajax() 的条件没有得到满足。知道为什么吗?
    • 是服务器错误还是浏览器错误,检查终端看看有没有500错误,还有我漏掉了一个逗号,所以复制新代码再试一次
    • 正如我所说,条件request.is_ajax() 没有得到满足,所以它直接进入else,因此什么也不打印。因此终端没有显示任何错误。
    • 打印request.method的值
    • request.method 是 POST 但 request.is_ajax() 是 False。
    【解决方案3】:

    当您使用 jQuery 和 Django 使用 csrf 发出 Ajax 请求时,您需要传递令牌,这使用 Django 文档 https://raw.github.com/carhartl/jquery-cookie/v1.3.1/jquery.cookie.js 中的 jQuery cookie 插件:

    /** Django's csrftoken ajax security & server failures */
    App.ajax = (function () {
    
    var csrftoken = $.cookie('csrftoken'),
        host = document.location.host,
        protocol = document.location.protocol,
        sr_origin = '//' + host,
        origin = protocol + sr_origin;
    
    return {
    
        'csrfSafeMethod': function (method) {
            return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
        },
    
        'sameOrigin': function (url) {
            return (url === origin || url.slice(0, origin.length + 1) === origin + '/') || (url === sr_origin || url.slice(0, sr_origin.length + 1) === sr_origin + '/') || !(/^(\/\/|http:|https:).*/.test(url));
        },
    
        '$setup': function () {
            var scope = this;
            // TODO:  create server failure pages and alert mechanism
            $.ajaxSetup({
                statusCode: {
                    401: function () {
    
                    },
                    403: function () {
    
                    }
                },
                beforeSend: function (xhr, settings) {
                    if (!(scope.csrfSafeMethod(settings.type) && scope.sameOrigin(settings.url))) {
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });
    
            return this;
        }
    }());
    
    $(document).ready(function(){
        App.ajax.$setup() 
        var $form = $('form');
    
        $form.on('submit' function(e){
            e.preventDefault();
    
             $.ajax({
                type: "POST",
                url: '/dashboard',
                data: $form.serialize(),
                success: function (response) {
                    window.alert(response);
                }
            });
    
        });
    });
    

    我个人更喜欢传递 JSON,还有你在什么浏览器上测试?查看这些库:

    https://raw.github.com/marioizquierdo/jquery.serializeJSON/1.0.0/jquery.serializeJSON.js

    https://raw.github.com/MoonScript/jQuery-ajaxTransport-XDomainRequest/master/jQuery.XDomainRequest.js

    【讨论】:

      猜你喜欢
      • 2013-04-03
      • 2011-08-18
      • 2014-01-12
      • 2011-12-21
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 2010-11-18
      • 2011-11-30
      相关资源
      最近更新 更多