2016-03-19 20 views
1

Web2py ajax işlevini explained in the book işlevini kullanarak ancak formun bir veritabanında depolanmasını istemediğimden yerine FORM kullanarak bir form göndermeye çalışıyorum.AJAX aracılığıyla gönderilen bir web2py formu nasıl doğrulanır?

ajax_test.html

{{extend "layout.html"}} 
<h2>Form</h2> 
{{=form}} 
<script> 
    jQuery("#myform").submit(function() { 
    ajax("{{=URL('ajax_test')}}", 
     ["mytext"], "output"); 
    return false; 
    }); 
</script> 
<h2>Output</h2> 
<div id="output"></div> 

Kontrol içinde default.py:

formu ( request.ajax == True) gönderilen
def ajax_test(): 
    form = FORM(
     INPUT(_type="text", _name="mytext", _id="mytext", 
       requires=IS_NOT_EMPTY()), 
     INPUT(_type="submit"), 
     _id="myform" 
    ) 

    if request.ajax: 
     if form.accepts(request.vars, session): 
      return DIV("Form submitted.") 
     elif form.errors: 
      return TABLE(*[TR(k, v) for k, v in form.errors.items()]) 
     else: 
      return DIV("Couldn't check form.") 

    return dict(form=form) 

, hem form.accepts ve form.errors dönüş False. Kullanıcının girişine request.vars.mytext aracılığıyla erişse de, web2py'nin özelliklerini kullanmak yerine kendi kendime doğrulamam gerekir.

Neyi eksik?

cevap

3

session nesnesini form.accepts() geçirdiğinizde, forma gizli bir _formkey alanı ekleyerek siteler arası talep sahteciliği koruması otomatik olarak uygulanacaktır. Form gönderildiğinde, bu gizli alanın değeri oturumda saklanan değerle karşılaştırılır ve eşleşme başarısız olursa form kabul edilmez.

Kodunuzda iki sorun var. İlk olarak, bir Ajax isteği olduğunda form.accepts numaralı telefonu arayın, böylece _formkey orijinal formda oluşturulmaz ve dahil edilmez. O düzeltmek için, aşağıdakileri deneyin:

form.process() 
if request.ajax: 
    if form.accepted: 

form.process()form.accepts(request, session) için sadece bir kısa yoldur. Yukarıdaki, form oluşturulduğunda başlangıçtaki Ajax çağrısı için bile çağrılır. Bu, _formkey değerini üretecek ve oturumda saklayacaktır.

İkincisi, Javascript kodunuzun tamamı yalnızca mytext alanını göndermiyor, bu nedenle gizli _formkey değeri sunucuya geri gönderilmeyecek. Sonuç olarak, form kabul edilmez (bu durumda, web2py bir hata göstermez, çünkü böyle bir başarısızlık tipik olarak kötü oyunun sonucudur).

Belgelendiğinden emin değilim, ancak ajax() işlevinin ikinci argümanı, jQuery selektörü olabilir; bu, seçili öğenin içindeki tüm form öğelerinin serileştirilmesi ve gönderilmesiyle sonuçlanır. Yani, deneyin:

ajax('{{=URL('ajax_test')}}', '#myform', 'output'); 

#myform seçici tüm formda sonuçlanacaktır tefrika edildikten, gizli alanlar form nesne dahil olmak üzere.

+0

Merhaba Anthony Cevabınız için teşekkürler. İkinci argümanı "#myform" olarak değiştirdim ama aynı sonucu alıyorum. '_formkey' gizli değeri hakkında farkındaydım, ama nedense üretilmiyor. Formun HTML kodu '

. Herhangi bir fikir? – cdonts

+0

Lütfen güncellenmiş cevaba bakınız. İlk olarak oluşturulduğunda formu işlemeniz gerekir, böylece kod eğer 'request.ajax: 'bloğunda olamaz. – Anthony

+0

Mükemmel! Çok teşekkürler. – cdonts

İlgili konular