2009-10-06 54 views
7

我做了reCAPTCHA的集成使用以下django snippetDjango表单向导和验证码

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() 
    ... 

但我在Django表单向导中定义的形式,并呼吁该领域的清洁方法两次,即使验证码包含在最后一个表格中。

如下列:

from registration.forms import RegistrationWizard,RegistrationForm,ProfileForm 

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

如何规避这种情况。有什么需要在最后一个表格上打两次清洁?

+4

我有同样的确切问题感谢在这里张贴此 – Evgeny 2009-12-25 01:20:02

+3

同样的问题。 – kjagiello 2010-09-24 19:12:53

+0

看到这是一岁多的时候......你有没有找到解决办法?嘿.. – 2010-10-01 11:58:34

回答

2

如果一个表单被绑定,它将在renderering时调用clean(即使你没有调用form.is_valid)。