ユーザーがログインしているかどうかに応じてReCaptchaフィールドを持つか持っていないFormクラスを作成する必要があります。フォーム内の条件フィールド
これはコメントフォームなので、フォーム作成/定義で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
定義から同等のコードを追加する方法があるはずです。
これを行うにはいい方法はありますか?
問題はウィジェットがリクエストについて何も知らないため、ログインしたユーザーに基づいて条件付きでレンダリングする方法がないことです。しかし、あなたはdjango-floppyformsを見たいかもしれません。テンプレートを使用してウィジェットをレンダリングするので、そのようにすることができます。 –
はい、それは私が持っていたアイデアです。テンプレートを通してウィジェットをレンダリングします。しかし、私は私がこれを行う場合でも、私のテンプレート変数にrequest.userを持てるかどうかはわかりません(widget.renderは、テンプレートのレンダリング、コンテキストが問題です)。 私がしたいと思うのは、後で解析されるテンプレートをレンダリングすることです。 – Lacrymology
だから私はdjango-floppyformsを提案しました。私は完全にはわかりませんが、単純に 'render'にテンプレートを使用させるのではなく、標準インクルードパターンで動作すると思います。他のインクルードされたテンプレートと同じように、テンプレートコンテキストで 'request'にアクセスできるはずです。それを試してみてください。 –