我需要在提交表单之前将表单数据发布到Django视图。我尝试的所有方法都失败了。进行ajax调用的javascript是:
$('#lockdown-email-form input[type=text]').focusout(function() {
var data = $('#lockdown-email-form form').serialize()
$.post("/lockdown-email", data)
})
接收呼叫的python是:
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'),
)
答案 0 :(得分:0)
我有一个暂时的,非常令人不满意的解决方案。
由于某些我还不了解(但最有可能与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来确保同步请求。我会寻找更好的解决方案。