0

フォームが送信される前に、フォーム データを 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'),
)
4

1 に答える 1

0

さて、私は一時的で、かなり不十分な解決策を持っています。

私がまだ理解していない何らかの理由で(ただし、django-lockdownで発生する可能性が最も高い)、最初にajax POSTリクエストが作成されたときにGETにリダイレクトされますが、2回目は期待どおりに動作します。したがって、私の解決策は、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 を使用します。私はより良い解決策を探します。

于 2013-11-05T21:10:43.783 に答える