2014-02-06 4 views
2

Я пытаюсь интегрировать django-recaptcha с django-registration. Я уже убедился, что регистрация django работает. Затем я устанавливаю и настраиваю django-recaptcha в соответствии с его документом (django-recaptcha 0.0.6).django-recaptcha не подтверждает ввод

я добавить класс captcha = ReCaptchaField() в RegistrationForm в registration/forms.py следующим образом:

from captcha.fields import ReCaptchaField 

class RegistrationForm(forms.Form): 
    required_css_class = 'required' 
    username = forms.RegexField(regex=r'^[\[email protected]+-]+$', max_length=30, label=_("Username"), error_messages={'invalid': _("This value may contain only letters, numbers and @/./+/-/_ characters.")}) 
    email = forms.EmailField(label=_("E-mail")) 
    password1 = forms.CharField(widget=forms.PasswordInput, label=_("Password")) 
    password2 = forms.CharField(widget=forms.PasswordInput, label=_("Password (again)")) 

    captcha = ReCaptchaField() 

    ... 

капча показывает вверх, но независимо от того, что я набрал в chptcha текста (типа ничего, правильно или неправильно) , после нажатия «Нижняя» всегда отображается «Это поле обязательно». (конечно, я ввел два поля пароля).

captcha error

Это не должно быть частной/открытым ключ, как проблема с неправильной установкой капчи не будет отображаться, а текст ошибки. Есть идеи?

BTW, я использую python 2.7 с django 1.4.3. И я проверил два браузера: хром и IE9.

[ОБНОВЛЕНО]

Я нашел основной причиной этой проблемы в том, что текст я напечатал не переходит на POST запрос показан следующим образом:

POST:<QueryDict: {u'username': [u'test123'], u'password1': [u'123'], u'csrfmiddlewaretoken': [u'BUvEURhlUMYDx1DjztgdRuK1CrI7WanY'], u'email': [u'[email protected]'], u'password2': [u'123']}>, 

HTML, исходный код, показанный на клиентский браузер отображается следующим образом. Обычно он должен иметь «recaptcha_challenge_field» в запросе POST, но я не уверен, почему клиентский браузер не отправляет эту переменную в запрос POST. Я совершенно новый для java-скрипта. Есть идеи?

<!doctype html> 
<html> 
    <head> 
     <title>Register for an account</title> 
    </head> 
    <body> 

<table> 
    <form method='post' action=''><div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='BUvEURhlUMYDx1DjztgdRuK1CrI7WanY' /></div> 
     <tr class="required"><th><label for="id_username">Username:</label></th><td><input id="id_username" type="text" name="username" maxlength="30" /></td></tr> 
<tr class="required"><th><label for="id_email">E-mail:</label></th><td><input type="text" name="email" id="id_email" /></td></tr> 
<tr class="required"><th><label for="id_password1">Password:</label></th><td><input type="password" name="password1" id="id_password1" /></td></tr> 
<tr class="required"><th><label for="id_password2">Password (again):</label></th><td><input type="password" name="password2" id="id_password2" /></td></tr> 
<tr class="required"><th><label for="id_captcha">Captcha:</label></th><td><script type="text/javascript"> 
    var DjangoRecaptchaOptions = { 
    "lang": "en" 
}; 
    if (typeof RecaptchaOptions !== 'object') { 
     RecaptchaOptions = DjangoRecaptchaOptions; 
    } else { 
     for (key in DjangoRecaptchaOptions) { 
      RecaptchaOptions[key] = DjangoRecaptchaOptions[key]; 
     } 
    } 
</script> 
<script type="text/javascript" src="https://www.google.com/recaptcha/api/challenge?k=6LeuNO4SAAAAAAdkaCUi6ybtISPI-YhIlOadgFNF&hl=en"></script> 
<noscript> 
    <iframe src="https://www.google.com/recaptcha/api/noscript?k=6LeuNO4SAAAAAAdkaCUi6ybtISPI-YhIlOadgFNF&hl=en" height="300" width="500" frameborder="0"></iframe><br /> 
    <textarea name="recaptcha_challenge_field" rows="3" cols="40"></textarea> 
    <input type='hidden' name='recaptcha_response_field' value='manual_challenge' /> 
</noscript> 
</td></tr> 
     <tr><td></td><td><input type="submit" value="Send activation email" /></td> 
    </form> 
</table> 

    </body> 
</html> 
+0

В шаблоне проверьте, есть ли запрос, если 'POST', а затем отобразить ошибку. Поскольку captcha - обязательное поле, его отображение при загрузке страницы. –

+0

Может быть ошибка javascript, препятствующая правильному представлению поля? –

+0

Я проверил запрос 'POST'. – user1817188

ответ

1

Я нашел ответ! Это связано с тегом <table> в registration_form.html, который предоставляется пакетом регистрации django. Содержание:

{% extends "registration/registration_base.html" %} 
{% load i18n %} 
{% block title %}{% trans "Register for an account" %}{% endblock %} 
{% block content %} 
<table> 
    <form method='post' action=''>{% csrf_token %} 
     {{ form }} 
     <tr><td></td><td><input type="submit" value="{% trans "Send activation email" %}" /></td> 
    </form> 
</table> 
{% endblock %} 

К сожалению, Recaptcha имеет другой <table> тег встроенный в Java Script, а это значит, там будет иметь ReCaptcha <table> тег внутри registration_form <table> тега. Хотя браузер может корректно отобразить страницу, однако, это не правильно восстановить поле, такое как «recaptcha_challenge_field» и «recaptcha_response_field» во встроенном <table>

Решение состоит в том, чтобы удалить связанный тег <table> из registration_form.html.

Смежные вопросы