簡體   English   中英

自定義Django登錄表單中間件

[英]Custom Django login form middleware

我正在尋找一種實現模式彈出式登錄表單的解決方案,以在整個導航欄中在站點范圍內使用。 我正在使用Django 1.11。 現在,我正在定義一個LoginFormMiddleware類,如下所示:

中間件

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中。 我也有在TEMPLATES = [ { ... 'OPTIONS': { 'context_processors': [ *** ] } ]定義的“ django.template.context_processors.request”。

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

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

但是什么也沒呈現-應該在哪里? 通過瀏覽器檢查器工具:

在此處輸入圖片說明

有人可以給我關於我所缺少的建議嗎?

完整的中間件列表:

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',
]

process_request來自舊的Django 1.10之前的中間件。 您正在使用新型中間件,因此Django將不會調用該方法。

您可以在調用get_response之前將該代碼移至__call__方法。

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

但是,我不確定使用中間件是否是這里的最佳方法。 我會考慮創建一個上下文處理器,將登錄表單添加到模板上下文中,然后將登錄請求提交到單個登錄視圖。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM