注册表单中缺少 Django CSRF 令牌

Django CSRF token is missing from signup form

我对 Django 应用程序进行了重大升级(从 1.7 到 1.10,Django Rest Framework 到 3.5.4),导致了另一个问题。我设法修复了导致注册页面出现 500 错误的其他一些错误,但 CSRF 令牌仍然存在问题。此功能在升级之前有效。我已经检查了错误页面中提到的所有内容(我有 DEBUG=True),但它们似乎都没有问题,如下所示:

在class"CompanyAdmin"我有注册方法:

def signup(self, request):
    if request.method == "GET":
        form = SignupForm()
    else:
        form = SignupForm(request.POST)

        if form.is_valid():
            company = form.save()
            user = company.managers.all()[0]
            user = authenticate(
                email=user.email, password=request.POST["password1"])
            if user is not None:
                login(request, user)
                return HttpResponseRedirect(reverse("bagdisken:index"))

    return shortcuts.render_to_response("bagdisken/signup.html",
                                        context=RequestContext(request, {
                                            'form': form,
                                        }))

我遇到了上下文问题,导致了 500 错误,我通过在上下文中添加请求来解决这个问题。以前是这样的:

return shortcuts.render_to_response("bagdisken/signup.html", {'form': form})

视图中存在 CSRF 令牌:

{% extends "admin/base_site.html"%}
{% load form_utils %}
{% block content_title%}{% endblock %}
{% block breadcrumbs %}{% endblock %}
{% block nav-global %}{% endblock %}
{% block coltype %}twelve columns offset-by-two{% endblock %}
{% block content%}
    <form id="signup" action="#" method="POST" >
        {% csrf_token %}
            {{ form|render }}
            <input type="submit" value="Submit" />
    </form>
{% endblock %}

并且 CsrfViewMiddleware 也存在于设置中:

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'corsheaders.middleware.CorsMiddleware',
# Uncomment the next line for simple clickjacking protection:
# 'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

仍然没有 csrf 令牌的隐藏输入。我该如何解决这个问题?

不要使用 render_to_response,它已过时。它不会使请求在响应中可用,因此 CSRF 模板上下文处理器不起作用。

请改用 render 快捷方式。它使用请求呈现模板,因此 CSRF 令牌将起作用。

from django.shortcuts import render

def signup(self, request):
    ...
    return render(request, "bagdisken/signup.html", {'form': form})