2015-08-22 3 views
0

Я пытаюсь создать веб-приложение, которое вводит данные с помощью ajax. Вход отправляется серверной стороне в Django, и мне нелегко получить правильное перенаправление URL-адреса. Я понимаю, что проблема на данный момент имеет отношение к приложению перевода django.Http302 Ответ при использовании Ajax для сообщения в Django view

См. Соответствующие разделы.

Ajax

$(document).ready(function(){ 
    $('#applicant_form').on('submit', function(event){ 
    event.preventDefault() //this will stop the file from submitting the form manually. 
    $.ajax({ 
     url :'/save_applicant/', // the endpoint 
     type : "POST", // http method 
     data : { the_post : "Yay" }, // data sent with the post request 
     dataType: "json", 
     // handle a successful response 
     success : function(json) { 
      console.log("success"); // another sanity check 
     }, 

     // handle a non-successful response 
     error : function(xhr,errmsg,err) { 
      $('#results').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+ 
       " <a href='#' class='close'>&times;</a></div>"); // add the error to the dom 
      console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console 
     } 
    }); 
    }); 
}); 

HTML/DJANGO ШАБЛОНЫ

<form method = "POST" action = "" class="form bgform" id="applicant_form"> 
    {% csrf_token %} 
    {{ applicant_form|crispy }} 
    <input class="btn btn-default" type="submit" name="Save" /> 
</form> 

views.py

def save_applicant(request): 
if request.method =='POST': 
    id = None 
    if 'applicant' in request.session: 
     id = request.session['applicant'] 

    applicant_form = ApplicantForm(request.POST) 
    if applicant_form.is_valid(): 
     session_applicant = applicant_form.save(commit=False) 
     if id: 
      session_applicant.id = id 
     else: 
      session_applicant.save() 
      request.session['applicant'] = session_applicant.id 
     return HttpResponse(json.dumps({'status':'applicant_saved'}), content_type='application/json') 

    else: 
     return HttpResponse(applicant_form.errors.as_json(),content_type='application/json') 

else: 
    return HttpResponse(json.dumps({'status':'not_post'}),content_type='application/json') 

urls.py

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf.urls.i18n import i18n_patterns 

urlpatterns = [ 
] 
urlpatterns += i18n_patterns(
    url(r'^$', 'plan_b_profile.views.home', name='home'), 
    url(r'^save_applicant/','plan_b_profile.views.save_applicant',name='save_applicant'), 
    url(r'^admin/', include(admin.site.urls)), 
) 

командной строки

[21/Aug/2015 20:53:43]"POST /save_applicant HTTP/1.1" 302 0 
[21/Aug/2015 20:53:43]"GET /en/save_applicant/ HTTP/1.1" 200 22 <---- HOW TO FIX THIS 

Еще раз спасибо!

+0

Разве что весь вид? – IanAuld

+0

Что вы пытаетесь сделать? – skyline75489

+0

эй я добавил полный обзор, извините, я не был уверен, что это было актуально. Я просто пытаюсь использовать ajax для POST для/save_applicant /. У меня есть перевод, хотя и вместо того, чтобы просто отправлять URL-адрес, как это обычно бывает, он меняет вызов GET и добавляет/en/save_applicant /. Не знаете, как это исправить, поэтому перенаправления не происходит. –

ответ

3

Я думаю, что лучшим решением этой проблемы будет динамически назначать пост URL в JavaScript.

Перепишите ваш шаблон, так что вы можете хранить где-то ваш URL обращенного Джанго, например, в action формы:

<form method = "POST" action="{% url "save_applicant" %}" class="form bgform" id="applicant_form"> 
    {% csrf_token %} 
    {{ applicant_form|crispy }} 
    <input class="btn btn-default" type="submit" name="Save" /> 
</form> 

И после AJAX к этому URL вместо статического, она будет уже с языком приставка, поэтому перенаправление не будет:

$(document).ready(function(){ 
    $('#applicant_form').on('submit', function(event){ 
    event.preventDefault() //this will stop the file from submitting the form manually. 
    $.ajax({ 
     url :$(this).attr('action'), // the endpoint 
     type : "POST", // http method 
     data : { the_post : "Yay" }, // data sent with the post request 
     dataType: "json", 
     // handle a successful response 
     success : function(json) { 
      console.log("success"); // another sanity check 
     }, 

     // handle a non-successful response 
     error : function(xhr,errmsg,err) { 
      $('#results').html("<div class='alert-box alert radius' data-alert>Oops! We have encountered an error: "+errmsg+ 
       " <a href='#' class='close'>&times;</a></div>"); // add the error to the dom 
      console.log(xhr.status + ": " + xhr.responseText); // provide a bit more info about the error to the console 
     } 
    }); 
    }); 
}); 
+0

Также: hardcoding URLS в шаблоне или Javascript не является хорошим решением – GwynBleidD

+0

большое спасибо !! :) и спасибо, что показывали мне, как получить URL-адрес без необходимости его жесткого кодирования. –

1

Итак, я отступил от проблемы и осознал свою глупую ошибку. Я только что изменил мою urls.py на следующее:

from django.conf.urls import include, url 
from django.contrib import admin 
from django.conf.urls.i18n import i18n_patterns 

urlpatterns = [ 
    url(r'^save_applicant/','plan_b_profile.views.save_applicant',name='save_applicant'), 
] 
urlpatterns += i18n_patterns(
    url(r'^$', 'plan_b_profile.views.home', name='home'), 
    url(r'^admin/', include(admin.site.urls)), 
) 
1

Даже используя свои собственные решения, вы можете обнаружить, что вы получаете 302 перенаправление, если вы возвращаете 404 Not Found статуса с вашей точкой зрения, когда вы используете расширения языка i18n , Я делаю это, когда некоторые параметры запроса неверны (я использую одно и то же представление для HTTP GET и HTTP/AJAX POST).

Причина в том, что некоторое промежуточное ПО Django (я думаю, LocaleMiddleware) обработает ответ на пути к стеку промежуточного программного обеспечения, увидит, что страница не найдена, и возвратите перенаправление 302 с предпочтительным префиксом языка браузера. Затем, когда это в свою очередь (в этом случае) не будет найдено по следующему запросу, вы получите другой ответ 404 Not Found. Это плохо, потому что вы никогда не увидите причину, по которой исходный запрос не удался.

В вашем случае вы можете исправить это, выполнив:

... 
urlpatterns = [ 
    url(r'^en/save_applicant/','plan_b_profile.views.save_applicant',name='save_applicant'), 
] 
... 

Это дураки обижая промежуточное программное обеспечение, думая, что это уже конкретный язык страницы (который на самом деле это так как вы вернуть английский язык в кнопке и AJAX).

Вы также можете удалить перенаправления в целом с помощью решения, такого как solid-i18n-url.

Редакция: Однако при отражении это, вероятно, плохая идея вернуть 404, как это в первую очередь; 400 Bad Request будет лучше ..

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