@im_age

Почему не работает post ajax запрос в Django?

Здравствуйте! Никак не получается сделать POST AJAX запрос в Django. При этом если меняю $.post на $.get - все работает.

Вот вьюшка которая генерит форму:
def registration(request):
    return render(request, "reg_form.html", {'form': RegistrationForm})

в JS все тоже просто:
$.post("/registration/ajax", {},
    function(data) {
        alert(data);
    })

{% csrf_token %} в форме есть и скрытое поле генерится.

Вьюшка для обработки запроса:
def test_ajax(request):
    if request.is_ajax():
        if request.method == 'POST':
            #print request.POST
            return HttpResponse("POST")
        else:
            return HttpResponse("GET")


В консоле(все на дев-серваке) вижу вот такое сообщение:
[19/Dec/2013 18:12:56] "POST /registration/ajax HTTP/1.1" 500 10961


Подскажите в чем проблема и как исправить?
  • Вопрос задан
  • 8512 просмотров
Решения вопроса 2
SilentSokolov
@SilentSokolov
Конечно хотелось бы увидеть полный вывод ошибки. Также советую взглянуть на этот раздел (ajax+csrf).
Ответ написан
Комментировать
@im_age Автор вопроса
В общем, вывел в консоль JSa все, что возвращается при ошибке.
там была строка

RuntimeError at /registration/ajax
You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data.


в итоге добавил slash в конец( /registration/ajax/) и POST тоже заработал. Это здорово, конечно, но может кто-нибудь объяснить почему так произошло, вернее почему с GET все работало и без этого слеша?

И еще один вопрос - как нужно использовать $.ajaxSetup() при моем ajax запросе?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
astrikovd
@astrikovd
Python Developer
При отправке POST запроса на URL без слэша в конце, django вам сначала отдает 301 статус, а потом перенаправляет ваш запрос куда-следует уже без данных. В итоге вы получали 500 статус.

Если запрос идет с помощью метода GET - даже после редиректа django данные в GET сохраняются и у вас, в итоге, всё работало.

Решение - если используете APPEND_SLASH в конфигурации, не забывайте направлять ajax-запросы на URL со слешем в конце.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы