自定义Django登录表单中间件

时间:2018-01-15 22:29:58

标签: django django-middleware django-1.11

我正在寻找一种实现模式弹出式登录表单的解决方案,以便在导航栏中使用网站范围。我正在使用Django 1.11。现在,我按如下方式定义LoginFormMiddleware类:

middleware.py

from django.http import HttpResponseRedirect

from django.contrib.auth import login
from django.contrib.auth.forms import AuthenticationForm

class LoginFormMiddleware(object):

    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        return self.get_response(request)

    def process_request(self, request):
        from django.contrib.auth.forms import AuthenticationForm
        if request.method == 'POST' and request.POST.has_key('base-account') and request.POST['base-account'] == 'Login':
            form = AuthenticationForm(data=request.POST, prefix="login")
            if form.is_valid():
                from django.contrib.auth import login
                login(request, form.get_user())
            request.method = 'GET'
        else:
            form = AuthenticationForm(request, prefix="login")
        request.login_form = form

这一切都包含在MIDDLEWARE = []中settings.py的标准方式中。我也有' django.template.context_processors.request'我应该在TEMPLATES = [ { ... 'OPTIONS': { 'context_processors': [ *** ] } ]中定义。

在我的模板中使用{{ request.login_form }},如下所示:

<div class="container">
  {{ request.login_form }}
</div>

然而,没有任何东西呈现 - 它应该在哪里?从浏览器检查器工具:

enter image description here

有人可以告诉我我错过了什么吗?

完整的中间件清单:

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'wagtail.wagtailcore.middleware.SiteMiddleware',
    'wagtail.wagtailredirects.middleware.RedirectMiddleware',
    'thinkingplace.middleware.LoginFormMiddleware',
]

1 个答案:

答案 0 :(得分:0)

process_request来自旧式的Django 1.10中间件。您使用的是新式中间件,因此Django不会调用该方法。

您可以在致电__call__之前将该代码移至get_response方法。

def __call__(self, request):
    # code that sets request.login_form
    return self.get_response(request)

但是,我不确定使用中间件是最好的方法。我会考虑创建一个上下文处理器,将登录表单添加到模板上下文,然后将登录请求提交到单个登录视图。