在Django开发服务器上使用JQuery的Ajax

0 投票
1 回答
1430 浏览
提问于 2025-04-16 12:20

我正在一个Django(1.2.5)的网站上用JQuery(1.5)做一个Ajax请求。目前我在开发服务器上工作,因为我打算在正式上线之前进行演示。

模板中的JavaScript代码:

function postTest()
{
        $.post("/get_elections", { csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val() }, alertResult);

}

function alertResult(result)
{
    alert(result);
}

它是如何被调用的:

<a href="" onclick='postTest()'>Link</a>
{% csrf_token %}

Ajax视图:

def get_selections(request):
if request.is_ajax():
    if request.method == 'GET':
        message = "This is an XHR GET request"
    elif request.method == 'POST':
        message = "This is an XHR POST request"
        # Here we can access the POST data
        print request.POST
else:
    message = "No XHR"
    return HttpResponse(message)

索引视图:

def index(request):
    polylist = [] 
    return render_to_response('test.html', {'polylist': polylist},context_instance=RequestContext(request))

URL配置:

(r'^gi_prototype/', 'world.views.index'),
(r'^get_selections$', 'world.views.get_selections')

相关设置:

APPEND_SLASH = 'false'

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
)

当我点击页面上的“链接”时,页面会重新加载,并且出现了一个异常。这个异常在Firebug和Firefox错误控制台中都能看到:

错误:未捕获的异常:[异常... "组件返回失败代码:0x80040111 >(NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.getAllResponseHeaders]" nsresult: "0x80040111 >(NS_ERROR_NOT_AVAILABLE)" 位置: "JS框架 :: http://localhost:8000/site_media/jquery-1.5.js :: 匿名 :: 第7207行" 数据: 无]

Django开发服务器提供了这个输出(我把令牌替换成了问号):

<QueryDict: {u'csrfmiddlewaretoken': [u'??????????????????????????????']}>
[22/Feb/2011 16:31:23] "POST /get_selections HTTP/1.1" 200 27
[22/Feb/2011 16:31:23] "GET /gi_prototype/ HTTP/1.1" 200 970

经过几个小时的搜索,我开始觉得这可能只是Django开发服务器的一个限制,但这似乎很愚蠢。任何其他建议都将非常有帮助。提前谢谢你。

1 个回答

2

我经过了很多个小时的研究,终于找到了答案,很多人可以从我的痛苦中吸取教训。

问题出在这里:

<a href="" onclick='postTest()'>Link</a>

无论用什么方式包装,XMLHttpRequests都不能通过带有href的链接标签的onclick事件来启动。我只是把代码改成了这样:

<form><input type='button' value='Link' onclick='postTest()'/></form>

然后它就完美地工作了。没有服务器问题,也没有AJAX错误。只需要使用正确的标记。

听我讲的这个悲惨故事的警告,别让自己也遭受同样的命运!

撰写回答