2009-10-06 6 views
7

Ich haben eine recaptcha Integration mit den folgenden django snippetdjango Formen Assistenten und 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() 
    ... 

Aber ich habe die in den django Formen Assistenten definiert Formen und es ruft die saubere Methode auf dem Feld zweimal, auch wenn das Captcha ist in der letzten Form enthalten.

Wie in der folgenden:

from registration.forms import RegistrationWizard,RegistrationForm,ProfileForm 

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

Wie umgehen ich diese Situation. Was ist die Notwendigkeit, die Reinigung der letzten Form zweimal aufzurufen?

+4

hatte ich exakt das gleiche Problem Dank für dieses Posting – Evgeny

+3

Das gleiche Problem hier. – kjagiello

+0

zu sehen, wie das ist ein Jahr alt ... Sie jemals eine Lösung finden? Heh .. –

Antwort

2

Wenn ein Formular gebunden ist, wird es beim Rendern immer sauber angezeigt (auch wenn Sie form.is_valid nicht aufrufen).