2009-10-06 2 views
7

私は、次のdjango snippetDjangoのフォームウィザードとreCAPTCHAの

settings.py 

    RECAPTCHA_PUBLIC_KEY = '<your public key>' 
    RECAPTCHA_PRIVATE_KEY = '<your private key>' 


#widgets.py 

    from django import forms 
    from django.utils.safestring import mark_safe 
    from django.conf import settings 
    from recaptcha import captcha 

    class ReCaptcha(forms.widgets.Widget): 
    recaptcha_challenge_name = 'recaptcha_challenge_field' 
    recaptcha_response_name = 'recaptcha_response_field' 

    def render(self, name, value, attrs=None): 
     return mark_safe(u'%s' % captcha.displayhtml(settings.RECAPTCHA_PUBLIC_KEY)) 

    def value_from_datadict(self, data, files, name): 
     return [data.get(self.recaptcha_challenge_name, None), 
     data.get(self.recaptcha_response_name, None)] 


#fields.py 

    from django.conf import settings 
    from django import forms 
    from django.utils.encoding import smart_unicode 
    from django.utils.translation import ugettext_lazy as _ 

    from marcofucci_utils.widgets import ReCaptcha 
    from recaptcha import captcha 

    class ReCaptchaField(forms.CharField): 
    default_error_messages = { 
     'captcha_invalid': _(u'Invalid captcha') 
    } 

    def __init__(self, *args, **kwargs): 
     self.widget = ReCaptcha 
     self.required = True 
     super(ReCaptchaField, self).__init__(*args, **kwargs) 

    def clean(self, values): 
     super(ReCaptchaField, self).clean(values[1]) 
     recaptcha_challenge_value = smart_unicode(values[0]) 
     recaptcha_response_value = smart_unicode(values[1]) 
     check_captcha = captcha.submit(recaptcha_challenge_value, 
     recaptcha_response_value, settings.RECAPTCHA_PRIVATE_KEY, {}) 
     if not check_captcha.is_valid: 
     raise forms.util.ValidationError(self.error_messages['captcha_invalid']) 
     return values[0] 


#forms.py 

    class RegistrationForm(forms.Form): 
    ... 
    recaptcha = marcofucci_fields.ReCaptchaField() 
    ... 

を使用してreCAPTCHAの統合を行いました。しかし、私は、Djangoのフォームウィザードで定義されたフォームを持っており、それがキャプチャしても、二度、フィールド上のきれいなメソッドを呼び出します最後の形式に含まれています。次のように

from registration.forms import RegistrationWizard,RegistrationForm,ProfileForm 

    url(r'^register/$', 
     RegistrationWizard([RegistrationForm,ProfileForm]), 
     name='register_wizard'), 

どのように私はこのような状況を回避します。最後のフォームでクリーンを2回呼び出す必要は何ですか?

+4

は、私はここで、この – Evgeny

+3

同じ問題を投稿するためのまったく同じ問題の感謝を持っていました。 – kjagiello

+0

これは一歳であると見ています...解決策を見つけたことはありますか? Heh .. –

答えて

2

フォームがバインドされている場合、(form.is_validを呼び出していなくても)レンダリングすると常にフォームがクリーンコールされます。

0

あなたはこの代わりに使用することを検討することをお勧めします:django snippet 1644

関連する問題