我有一个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
这一切都运行正常,但我想在下一页的响应上下文中添加一些东西,只有登录成功。我不确定如何:
auth_views.login()
后成功登录,或答案 0 :(得分: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
答案 1 :(得分: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。