2

我有一个 Django 项目,其中我目前有一个标准登录视图的包装器:

from django.contrib.auth import views as auth_views
from myapp.forms import LoginForm

def login(request, *args, **kwargs):
    """Wrapper for auth.login."""
    kwargs['template_name'] = 'login.html'
    kwargs['authentication_form'] = LoginForm
    auth_view_response = auth_views.login(request, *args, **kwargs)
    return auth_view_response

这一切都很好,但我想在下一页的响应上下文中添加一些内容,前提是登录成功。我不确定如何:

  1. 检查用户是否在auth_views.login()被调用后成功登录,或者
  2. 添加一个将在下一页的上下文中显示的变量。
4

2 回答 2

1

通常,我在发布我的 SO 问题后不久就想出了一个答案。

我不需要对登录视图做任何事情。相反,我使用user_logged_in信号:

from django.contrib.auth.signals import user_logged_in

def post_login_actions(sender, user, request, **kwargs):
        request.session['just_logged_in'] = True

user_logged_in.connect(post_login_actions, dispatch_uid="user_logged_in")

(我把它放在我的末尾myapp/models/userprofile.py。)

然后我有一个myapp/context_processors.py这样的:

from django.conf import settings

def membership_context(request):
    context = {
        'just_logged_in': request.session.get('just_logged_in', False),
    }
    # Now we've used any True setting for this, set it to False subsequent requests:
    request.session['just_logged_in'] = False
    return context

当然,将其包含在我的设置中TEMPLATE_CONTEXT_PROCESSORS

from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS
TEMPLATE_CONTEXT_PROCESSORS += (
    'myapp.context_processors.membership_context',
)

现在,每个模板just_logged_in在其上下文中都有一个值,通常为 False,但在用户登录后的第一个页面视图中将为 True。

于 2013-02-05T14:44:22.953 回答
1

谈到第一个问题:

在调用 auth_views.login() 后检查用户是否成功登录,或者

在视图函数中检查request.user.is_authenticated()

说到第二个问题,您可以在用户会话中添加变量,然后在下一页检查它:

#in the view mentioned above    
if request.user.is_authenticated():
    request.session['some_key'] = "some_var"

#in the view, that represents the next page
foo = request.session.get('some_key',None)
#now you can add foo to template context
于 2013-02-05T14:27:43.383 回答