Necesito hacer una clase de formulario que puede o no tener un campo ReCaptcha dependiendo de si el usuario está conectado o no.Campo condicional en el formulario
Como se trata de un CommentForm, no tengo acceso al objeto request
en la creación/definición del formulario, por lo que no puedo confiar en eso.
Para la solicitud POST
la solución es fácil: Tengo esto:
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()
Una vez hecho esto, la validación de formularios debe funcionar según lo previsto. El problema ahora está en el lado de la plantilla. Necesito la plantilla que ser así:
<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>
pero me gustaría no tener que repetir ese código en cada plantilla comments/*/form.html
. Supongo que debería haber alguna manera de agregar un código equivalente desde el método render
de un widget y la definición Media
.
¿Alguien puede pensar en una buena manera de hacer esto?
El problema es que los widgets no saben nada acerca de la solicitud, por lo que no hay forma de representar condicionalmente en función del usuario que ha iniciado sesión. Aunque, es posible que desee ver django-floppyforms. Como utiliza plantillas para representar widgets, es posible que pueda hacer lo que quiera de esa manera. –
sí, esa es la idea que tuve, renderizar un widget a través de una plantilla. Pero no estoy seguro de poder tener request.user en mi template vars incluso si hago esto (widget.render puede hacer lo que quiera, incluyendo renderizar una plantilla, el contexto es el problema). Lo que me gustaría hacer es renderizar una plantilla, que será analizada más tarde en – Lacrymology
Es por eso que sugerí django-floppyforms. No estoy del todo seguro, pero creo que funciona con el patrón de inclusión estándar, en lugar de simplemente hacer que 'render' use una plantilla. Debería tener acceso a 'request' en el contexto de la plantilla al igual que cualquier otra plantilla incluida.Pruébelo y vea. –