JQuery POST для перенаправления Django в GET без данных

Мне нужно отправить данные формы в представление Django перед отправкой формы. Все методы, которые я пытаюсь выполнить, не совпадают. Javascript для вызова ajax:

$('#lockdown-email-form input[type=text]').focusout(function() {
 var data = $('#lockdown-email-form form').serialize() 
 $.post("/lockdown-email", data)
})

и питон, который получает вызов:

def lockdown_email(request):
 msg = ''
 logger.info(request.method)
 if request.method == 'POST':
 form = LockdownEmailForm(request.POST)
 if form.is_valid():
 email_content = "Email:\n" + form.cleaned_data['email']
 mail_admins('Email for preview submission', email_content)
 msg = 'Thank you! Entering site.'
 else:
 msg = 'Email required'
 return HttpResponse(msg)

Проблема заключается в том, что каждый раз, когда в запрос делается перенаправление на тот же URL-адрес, но с помощью метода GET (от поиска в вкладке "Сетевая утилита"), функция не работает. Я искал долгое время; некоторые советы относятся к CSRF, но я отключил это в settings.py, и он все еще не работает.

Это находится на странице django-lockdown, хотя этот конкретный пример не взаимодействует с блокировкой. Есть идеи?

РЕДАКТИРОВАТЬ:

urls.py

from django.conf.urls import patterns, url
from django.views.generic import TemplateView

from app import views

urlpatterns = patterns('',
 url(r'^robots.txt$', TemplateView.as_view(template_name="app/robots.txt")),
 url(r'^$', views.index, name='index'),
 url(r'lockdown-email$', views.lockdown_email, name='lockdown_email'),
 url(r'get-locations$', views.get_locations, name='get_locations'),
 url(r'amend-data$', views.amend_data, name='amend_data'),
 url(r'feedback$', views.feedback, name='feedback'),
 url(r'contest-data$', views.contest_data, name='contest_data'),
)
1 ответ

Ну, у меня есть временное и довольно неудовлетворительное решение.

По какой-то причине, которую я еще не понял (но, скорее всего, с django-lockdown), первый запрос ajax POST сделан, он перенаправляется на GET, но второй раз он ведет себя так, как ожидалось. Поэтому мое решение - просто изменить js, чтобы выглядеть так:

$('#lockdown-email-form input[type=text]').focusout(function() {
 var data = "email=" + $('#lockdown-email-form input[type=text]').val()

 $.ajax({
 url: '/lockdown-email',
 type: 'POST',
 async: false,
 data: data,
 })
 $.ajax({
 url: '/lockdown-email',
 type: 'POST',
 async: false,
 data: data,
 })

})

Использование ajax not post для обеспечения синхронных запросов. Однако я буду искать лучшее решение.

licensed under cc by-sa 3.0 with attribution.