2009-10-06 24 views
7

Tôi đã làm một hội nhập reCAPTCHA sử dụng sau django snippetdjango dạng wizard và 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() 
    ... 

Nhưng tôi có các hình thức quy định tại trình hướng dẫn các hình thức django và nó gọi phương thức sạch trên sân hai lần, ngay cả khi hình ảnh xác thực được bao gồm trong biểu mẫu cuối cùng.

Như trong những điều sau đây:

from registration.forms import RegistrationWizard,RegistrationForm,ProfileForm 

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

Làm thế nào để phá vỡ tình trạng này. Sự cần thiết phải gọi sạch sẽ trên mẫu cuối cùng hai lần là gì?

+4

tôi đã có chính xác cùng một vấn đề nhờ gửi bài cho – Evgeny

+3

Cùng vấn đề này ở đây. – kjagiello

+0

xem như thế nào là một năm tuổi ... bạn đã bao giờ tìm thấy một giải pháp? Heh .. –

Trả lời

2

Nếu biểu mẫu bị ràng buộc, allways sẽ gọi sạch khi hiển thị (ngay cả khi bạn không gọi form.is_valid).

Các vấn đề liên quan