Esta respuesta no es específico de Django registro, pero sólo usando Django con Jinja2 en general.
CsrfViewMiddleware de Django establece la cookie csrf_token si determina que ha accedido al miembro de contexto csrf_token. Lamentablemente, la representación de Jinja2 no se produce hasta después de que se ejecuta el middleware de Django. Como resultado, la cookie no se establece y, por lo tanto, no coincide con el formulario, y obtendrá el error 403.
Para solucionar este problema, debe acceder al contexto ['csrf_token'] en algún momento antes de finalizar el procesamiento de la respuesta.
Si está utilizando puntos de vista basados en la clase, se puede crear un CsrfProtectMixin:
class CsrfProtectMixin(object):
def render_to_response(self, context, **response_kwargs):
# Csrf processing happens when using a RequestContext.
# Be sure to use one.
if not isinstance(context, RequestContext):
context = RequestContext(self.request, context)
# Force access to csrf_token due to the way jinja2 renders the template
# after middleware has finished processing. Otherwise, the csrf cookie
# will not be set.
str(context.get('csrf_token'))
return super(CsrfProtectMixin, self).render_to_response(context, **response_kwargs)
Y luego, en la clase de vista:
class MyView(CsrfProtectMixin, TemplateView):
def get(self, request, *args, **kwargs):
context = {}
return self.render_to_response(context)
Si no se está usando basado en clases puntos de vista, se puede hacer algo como:
def my_view(request):
context = RequestContext(request)
str(context['csrf_token']) #force access to the csrf_token
return render_to_response('template.html', context)
O quizás mono parche render_to_reponse con la lógica de la clase, encima.
¿Cómo es tu plantilla? – JonC
{% extends "site_base.html" %} {% cuerpo de bloque%}
{% cuerpo endblock%} – mgPePe