Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ajax Django员额不起作用:_Ajax_Django_Jquery - Fatal编程技术网

Ajax Django员额不起作用:

Ajax Django员额不起作用:,ajax,django,jquery,Ajax,Django,Jquery,我正在使用Django 1.2.3开发一个站点。我的ajax get请求工作正常,但post请求在开发模式(127.0.0.1:8000)下工作,但在我使用apache+nginx将站点推到生产环境中时工作不正常 这里有一个例子 URL.py: (r'api/newdoc/$', 'mysite.documents.views.newdoc'), views.py def newdoc(request): # only process POST request if reque

我正在使用Django 1.2.3开发一个站点。我的ajax get请求工作正常,但post请求在开发模式(127.0.0.1:8000)下工作,但在我使用apache+nginx将站点推到生产环境中时工作不正常

这里有一个例子

URL.py:

(r'api/newdoc/$', 'mysite.documents.views.newdoc'),
views.py

def newdoc(request):
    # only process POST request
    if request.is_ajax():
        data= dict(request.POST)

                # save data to db



    return HttpResponse(simplejson.dumps([True]))
在javascript中:

$.post("/api/newdoc/", {data : mydata}, function(data) { alert(data);}, "json");
我的警报从未被调用。。。。这是一个问题,因为我想通过django表单清理这些数据,而post请求似乎没有将其发送到服务器(仅在生产环境中)

我做错了什么

更新:

解决方案:从django 1.3开始,crsf令牌需要在ajax post请求(而不是GET)中推送

另外,根据下面提供的链接,以下javascript

$.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                // Only send the token to relative URLs i.e. locally.
                xhr.setRequestHeader("X-CSRFToken",
                                     $("#csrfmiddlewaretoken").val());
            }
        }
    });
需要进行如下更改:

$.ajaxSetup({
        beforeSend: function(xhr, settings) {
            if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
                // Only send the token to relative URLs i.e. locally.
                xhr.setRequestHeader("X-CSRFToken",
                                     $('input[name="csrfmiddlewaretoken"]').val());
            }
        }
    });
csrf令牌在表单中呈现的方式必须在1.25到1.3之间发生更改??
不管怎样,它是有效的。谢谢大家的帮助大家

粗略地看一下,您的代码看起来不错,但我将向您展示一个ajax表单处理代码的示例,希望它能帮助您找出正在发生的错误。不过,@dmitry评论的内容应该是您调试的第一步——使用firebug或inspector查看ajax调用是否返回错误

// js (jQuery 1.5)
$(form).submit(function(event) {
            event.preventDefault();
            $.post(post_url, $(form).serialize())
              .success(function(data, status, jqxhr) {
                if (data.success) { // form was valid
                    $(form)
                    // other irrelevant code
                    .siblings('span')
                      .removeClass('error')
                      .html('Form Successful');
                } else { // form was invalid
                    $(form).siblings('span').addClass('error').html('Error Occurred');
                }
              })
              .error(function(jqxhr, status, error) { // server error
                $(form).siblings('span').addClass('error').html("Error: " + error);
              });
});


// django
class AjaxFormView(FormView):
    def ajax_response(self, context, success=True):
        html = render_to_string(self.template_name, context)
        response = simplejson.dumps({'success': success, 'html': html})
        return HttpResponse(response, content_type="application/json", mimetype='application/json')


// view deriving from AjaxFormView

    def form_valid(self, form):
        registration = form.save()
        if self.request.is_ajax():
            context = {'competition': registration.competition }
            return self.ajax_response(context, success=True)
        return HttpResponseRedirect(registration.competition.get_absolute_url())

    def form_invalid(self, form):
        if self.request.is_ajax():
            context = { 'errors': 'Error Occurred'}
            return self.ajax_response(context, success=False)
        return render_to_response(self.template_name, {'errors':form.errors})

实际上,将上述内容与代码进行比较,您可能需要在django视图中设置content_类型,以便jQuery能够理解和处理响应。请注意,上面使用的是django 1.3基于类的视图,但不管怎样,逻辑应该是熟悉的。我使用
context.success
来表示表单处理是否通过或失败,因为任何类型的有效响应(json)都会向
jQuery.post
发出请求成功的信号。

您能直接从生产服务器访问javascript文件吗?您在生产中使用的是哪个Django版本?如果在生产中使用1.2.5+,则需要在AJAX post操作期间将csrf令牌推送到服务器

看到和

要检查您的Django版本,请执行以下操作:

import django
django.get_version()

在生产站点或生产服务器的shell中打印上述内容,同时确保使用正确的Python路径。

使用firebug或webkit的inspector查看请求的结果,我打赌那里有500个错误。实际上我得到了403个禁止。。。试图发送ajax表单的用户是否已登录?我没有任何用户身份验证系统将内容添加到我的httrensponse中,mimetype='application/json',尽管$python-c“import django;print django.get_version()”1.3ok所以解决方案实际上是CSRF令牌没有通过ajax请求推送。我必须做的一个修改是以下内容(从1.2.5发行说明中提供的链接中获取),看起来您正在生产中使用1.3。在您的开发机器上创建一个新的virtualenv并安装django 1.3。从那里运行您的项目并测试post ajax操作。您可能需要从我上面发布的CSRF链接中阅读更多内容。