2

django-recaptcha を django-registration に統合しようとしています。私はすでにdjango-registrationが機能することを確認しています。次に、ドキュメント ( django-recaptcha 0.0.6 ) に従って django-recaptcha をインストールして構成します。

captcha = ReCaptchaField()次のようにinRegistrationFormクラスを追加registration/forms.pyします。

from captcha.fields import ReCaptchaField

class RegistrationForm(forms.Form):
    required_css_class = 'required'
    username = forms.RegexField(regex=r'^[\w.@+-]+$', 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 テキストに何を入力しても(何も入力しない、正しい、または正しくない)、「下部」を押すと、常に「このフィールドは必須です」と表示されます。(もちろん、2 つのパスワード フィールドに入力しました)。

キャプチャ エラー

間違った設定ではキャプチャが表示されず、エラーテキストが表示されるため、秘密/公開キーの問題ではありません。何か案が?

ところで、私はdjango 1.4.3でpython 2.7を使用しています。また、chrome と IE9 の 2 つのブラウザーをテストしました。

[更新しました]

この問題の根本的な原因は、入力したテキストが次のように POST 要求に渡されないためであることがわかりました。

POST:<QueryDict: {u'username': [u'test123'], u'password1': [u'123'], u'csrfmiddlewaretoken': [u'BUvEURhlUMYDx1DjztgdRuK1CrI7WanY'], u'email': [u'test@gmail.com'], u'password2': [u'123']}>,

クライアントブラウザに表示されるhtmlソースコードは以下のように表示されます。通常、POST リクエストには「 recaptcha_challenge_field 」が含まれているはずですが、クライアント ブラウザが 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>
4

1 に答える 1

2

答えが見つかりました!これは、<table>django-registration パッケージによって提供される registration_form.html のタグが原因です。内容は次のとおりです。

{% 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 スクリプトには別のタグが埋め込まれています。これは、recaptcha<table>タグが registration_form タグ内にあることを意味し<table>ます。ブラウザはページを正しくレンダリングできますが、埋め込みの「recaptcha_challenge_field」や「recaptcha_response_field」などのフィールドを正しく取得しません。<table>

<table>解決策は、関連するタグを registration_form.html から削除することです。

于 2014-02-17T08:27:23.993 に答える