ユーザーがログインしているかどうかに応じて 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
定義から同等のコードを追加する何らかの方法があるはずです。
誰でもこれを行うための良い方法を考えることができますか?