6

我是 Ajax 和 Django 的新手。为了简化问题,假设我有一个隐藏表单和两个对象,并且我要求用户单击对象的某些位置。每次点击都会填写表格的一部分。我希望为每个对象填写一次表格。所以总共两次。当为第一个主题填写表单时,我想通过 Ajax 将表单发送到服务器,而不刷新页面,并允许为第二个对象重新填写表单。但是,由于某种原因,我无法通过 ajax 发送表单。

这是我的代码:index.html:

<html>
<body>
<script src="{{ STATIC_URL }}prototype.js"></script>
<script src="{{ STATIC_URL }}jquery.js"></script>
<script>

  objectID= 1;
  num_obj = {{num_obj}}

  function ajax_post(){
    $('#inputform').submit(function() {  
        $.ajax({ 
            type: 'POST',
            url: '/index/',
            data: $(this).serialize(),
            success: function(data){alert(data)}

         }); // end new Ajax.Request
    });
  }


 function onDocumentMouseDown( event ) {
        ....do stuff
        if (objectID < num_obj){
           ajax_post()
           }
        if (objectID == num_obj){ 
            $("form").submit();}
        objectID ++;
        $("form").clearForm();
        document.forms[0].ObjectID.value = objectID;
        }
  </script>
  <form action="" method="post" id="inputform">
      <div id="ajaxwrapper">
       {% csrf_token %}
       <table>
        {{ form.as_table }}
       </table>
     </div>
  </form>
</body>
</html>

我的观点.py:

from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import *
from firstapp.forms import PracForm3

num_obj=2

def index(request):
   Obj.objects.all().delete()
   if request.method == 'POST':
    form = PracForm3(request.POST)
    print "\n\n\n\n\n"
    if request.is_ajax():
      print "yaaaaay AJAX"
      print request.POST
    else:
      print "noooooo"
    print "\n\n\n\n\n"
    if form.is_valid():
      cd = form.cleaned_data
      .....
      if cd['ObjectID'] == num_obj:
        return HttpResponseRedirect('/submit')
   else:
     form = PracForm3()
     dic = {'form': form, 'num_obj': num_obj, ...}
   return render_to_response('index.html', dic, context_instance=RequestContext(request))  

我的 urls.py:

from django.conf.urls import patterns, include, url
from firstapp.views import index, submit
from django.conf import settings

urlpatterns = patterns('',
('^index$', index),
('^submit$', submit),
)

出于某种原因,我的 Ajax 无法工作任何人都知道我做错了什么吗?

4

5 回答 5

3

这可能是与 AJAX 帖子相关的 CSRF,您必须记住在每个 POST 请求中将 CSRF 令牌作为 POST 数据传递。您可能需要在此处添加此代码,这是讨论 Django+CSRF+AJAX 的 Django 文档。

我在您的 Django 视图中注意到您正在重定向到“提交” 通常使用 ajax 我不会重定向到不同的 url,我会使用 HttpResponse 并返回一些字符串值,例如 JSON。我也不知道为什么您的视图中有打印语句,除非您在调试器中沉浸在该视图中。对于测试/调试,您应该有一个变量,您可以将一些字符串分配给,然后将其传递回您的 ajax。然后在您的 ajax 中,您可以从视图中读取消息,如下所示。

def index(request):
    ...
    if request.is_ajax():
        msg = 'it worked'
    else:
        msg = 'i am sad'
    return HttpResponse(msg)
    ...

此外,您的 javascript 在 ajax 调用中应该有一个成功和错误函数,您只有成功,所以您不会捕获错误,因为您的 javascript 看起来有点像这样:

...
success: function(data){alert(data)}, 

error: function(data){alert(data)}
...         

看起来您可能遇到了几个问题。如果您还没有完成我给您链接的 CSRF 内容,那么如果您不想以首选方式进行测试,请使用 csrf_exempt 进行测试。尝试上面的代码位,看看是否对您有所帮助。

于 2012-12-03T07:02:40.240 回答
1

csrf 令牌包含在$('#input-form')发布请求中,所以我认为这不是问题。我认为问题在于您没有在视图中将上下文转换为 json。这是来自文档示例

import json
from django.http import HttpResponse

class JSONResponseMixin(object):
    """
    A mixin that can be used to render a JSON response.
    """
    response_class = HttpResponse

    def render_to_response(self, context, **response_kwargs):
        """
        Returns a JSON response, transforming 'context' to make the payload.
        """
        response_kwargs['content_type'] = 'application/json'
        return self.response_class(
            self.convert_context_to_json(context),
            **response_kwargs
        )

    def convert_context_to_json(self, context):
        "Convert the context dictionary into a JSON object"
        # Note: This is *EXTREMELY* naive; in reality, you'll need
        # to do much more complex handling to ensure that arbitrary
        # objects -- such as Django model instances or querysets
        # -- can be serialized as JSON.
        return json.dumps(context)
于 2013-07-19T02:17:09.473 回答
0

可能是 csrf 引起的,@csrf_exempt在方法名前加上会有帮助。

@csrf_exempt
def method(args):
    pass
于 2012-12-03T07:11:39.430 回答
0

/index/在 ajax 调用中请求,但您的模式匹配/index.

于 2012-12-03T04:50:31.137 回答
0

我注释掉了 CSRF,所以问题不是我的 ajax 函数。这是正确的方法:

function ajax_post(){ 
    $.ajax({ 
        type: 'POST',
        url: '/index/',
        data: $(this).serialize(),
        success: function(data){alert(data)}

     }); // end new Ajax.Request
}

感谢您的输入

于 2012-12-04T06:05:35.430 回答