5

ユーザーがログインしているかどうかに応じて ReCaptcha フィールドがある場合とない場合がある Form クラスを作成する必要があります。

これは CommentForm であるため、requestフォームの作成/定義時にオブジェクトにアクセスできないため、それに依存することはできません。

リクエストの場合POST、解決策は簡単です: 私はこれを持っています:

class ReCaptchaCommentForm(CommentForm):
    def __init__(self, data=None, *args, **kwargs):
        super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs)
        if data and 'recaptcha_challenge_field' in data:
            self.fields['captcha'] = ReCaptchaField()

これを行うと、フォームの検証は意図したとおりに機能するはずです。問題はテンプレート側にあります。テンプレートは次のようにする必要があります。

<form action={% comment_form_target %} method="post">
{# usual form stuff #}
{% if not user.is_authenticated %}
<script  type="text/javascript"
         src="http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"></script>
<div id="recaptcha-div"></div>
<script type="text/javascript">
  Recaptcha.create({{ public_key }}, "recaptcha-div",
                   { theme: 'white',
                     callback: Recaptcha.focus_response_field });
</script>
{% endif %}
</form>

comments/*/form.htmlしかし、すべてのテンプレートでそのコードを繰り返す必要はありません。ウィジェットのrenderメソッドとMedia定義から同等のコードを追加する何らかの方法があるはずです。

誰でもこれを行うための良い方法を考えることができますか?

4

4 に答える 4

5

私はあなたがビューであなたのフォームをインスタンス化すると仮定します、それであなたはただユーザーをリクエストからフォームに渡すことができます(認証アプリのSetPasswordフォームのように):

def __init__(self, user, data=None, *args, **kwargs):
    super(ReCaptchaCommentForm, self).__init__(data, *args, **kwargs)
    if user.is_authenticated():
        self.fields['captcha'] = ReCaptchaField()
于 2012-06-07T17:35:23.513 に答える
3

クリスピーフォームを使おう!ビュー リクエスト コンテキストに基づいてフィールドを除外/含めることができるフォーム レイアウトに html 要素を含めることができます。それ以外にも非常に便利な機能。

関連するドキュメントセクションは次のとおりです。

于 2012-06-07T17:51:44.147 に答える
0

残念ながら、django-floppyformsがリクエストへのアクセスを許可していません。私は最近、自分のプロジェクトでdjango-floppyformsを使い始めたので、それがオプションであると知っていれば良かったでしょう。

それを除けば、私が考えることができる最善のことは、単にテンプレートの継承に依存することです。ファイルを作成して、comments/form.htmlそれぞれcomments/*/form.htmlに拡張させることができます。Recaptchaコードをベースに配置して、準備が整いましたform.html

于 2012-06-06T21:28:02.077 に答える