2011-02-22 2 views
0

Я собираю запрос Ajax с JQuery (1.5) на сайте Django (1.2.5). Я работаю над Dev Server в настоящее время, потому что планирую проводить демонстрации перед полным выпуском продукта.Ajax с JQuery на сервере Django Dev

Код 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)) 

привязок:

(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', 
) 

Когда я нажимаю на "Link" на странице, перезагружается страница и генерируется исключение. Исключение, как в Firebug и в Firefox Консоль ошибок:

Error: uncaught exception: [Exception... "Component returned failure code: 0x80040111 >(NS_ERROR_NOT_AVAILABLE) [nsIXMLHttpRequest.getAllResponseHeaders]" nsresult: "0x80040111 >(NS_ERROR_NOT_AVAILABLE)" location: "JS frame :: http://localhost:8000/site_media/jquery-1.5.js :: anonymous :: line 7207" data: no]

Джанго Dev сервер предоставляет этот вывод (маркер заменен вопросительными знаками мной):

<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 Dev Server, но это кажется глупым. Любые другие предложения были бы очень полезными. Заранее спасибо.

+0

Почему не просто '$ ('input [name = csrfmiddlewaretoken]'). Val()'? –

+0

Я просто сделал это первым способом, который пришел на ум. Я не получаю ошибку 403, поэтому я не думаю, что это проблема, но я могу дать ей шанс. – MrOodles

+0

Я отредактировал это сообщение, чтобы оно соответствовало вашему предложению. Тот же результат возникает, но, по крайней мере, на одной строке меньше javascript. ;) – MrOodles

ответ

2

Итак, я обнаружил ответ после долгих часов исследований, и многим было бы полезно учиться на моей боли.

Проблема заключается здесь:

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

XMLHttpRequests, независимо от того, что их обертки, не может быть инициирована через OnClick в связи с тегом HREF. Я просто изменил код на это:

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

И это сработало отлично. Нет проблем с сервером. Нет ошибок AJAX. Просто вопрос правильной разметки.

Прислушайтесь к моим рассказам о горе, чтобы вы не постигли мою судьбу!

+1

Ваша функция onclick должна возвращать значение false, в противном случае будет следовать ссылка. Вот почему вы видите, что вы попадаете на сетевую панель. –

+1

было бы понятно, если вы использовали привязки jQuery IMO. return false или event.preventDefault() полезны в этом случае. –

+0

Оба эти предложения решили бы мою проблему. В то время я не понимал, что href = "" указывает на одну и ту же страницу и в основном инициирует запрос на перезагрузку страницы. – MrOodles

Смежные вопросы