Этот ответ не относится только к django-регистрации, но в целом использует Django с Jinja2.
Django CsrfViewMiddleware устанавливает файл cookie csrf_token, если он определяет, что вы получили доступ к члену контекста csrf_token. К сожалению, рендеринг Jinja2 происходит только после выполнения промежуточного программного обеспечения Django. В результате cookie не устанавливается, и поэтому не соответствует форме, и вы получите ошибку 403.
Чтобы обойти эту проблему, вам нужно получить доступ к контексту ['csrf_token'] в какой-то момент, прежде чем вы закончите обработку ответа.
Если вы используете представления на основе классов, вы можете создать 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)
А потом по вашему мнению класс:
class MyView(CsrfProtectMixin, TemplateView):
def get(self, request, *args, **kwargs):
context = {}
return self.render_to_response(context)
Если вы не используете представления на основе классов, вы можете сделать что-то вроде:
def my_view(request):
context = RequestContext(request)
str(context['csrf_token']) #force access to the csrf_token
return render_to_response('template.html', context)
Или, возможно, патч обезьяны render_to_reponse с логикой в классе выше.