您好我为我的项目使用了django inbult auth urls和views,现在已经完成了初始用户帐户创建/登录/重置密码过程。
现在,用户可以登录并重定向到成功登录后的URL帐户/个人资料/。
我对django登录功能有几点疑问。为方便起见,我复制粘贴下面的django内置登录功能代码。
@sensitive_post_parameters()
@csrf_protect
@never_cache
def login(request, template_name='registration/login.html',
redirect_field_name=REDIRECT_FIELD_NAME,
authentication_form=AuthenticationForm,
current_app=None, extra_context=None):
"""
Displays the login form and handles the login action.
"""
redirect_to = request.REQUEST.get(redirect_field_name, '')
if request.method == "POST":
form = authentication_form(request, data=request.POST)
if form.is_valid():
# Ensure the user-originating redirection url is safe.
if not is_safe_url(url=redirect_to, host=request.get_host()):
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
# Okay, security check complete. Log the user in.
auth_login(request, form.get_user())
return HttpResponseRedirect(redirect_to)
else:
form = authentication_form(request)
current_site = get_current_site(request)
context = {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}
if extra_context is not None:
context.update(extra_context)
return TemplateResponse(request, template_name, context,
current_app=current_app)
我的问题是:
1 REDIRECT_FIELD_NAME
中函数中的django.contrib.auth
是否设置为'/ profile /'?
我可以看到此变量是从django.contrib.auth
from django.contrib.auth import REDIRECT_FIELD_NAME, login as auth_login, logout as auth_logout, get_user_model
我没有对此变量进行任何设置,但在用户成功登录后,该页面将定向到/ accounts / profile /
2登录功能是否通过了有关用户的帐户信息?如果是,我该如何访问它?
从代码中,如果用户成功登录,页面将被重定向:return HttpResponseRedirect(redirect_to)
重定向到accounts / profile /,最初网址的视图只是一个
HttpResponse("You have logged in successfully")
现在当我尝试实现视图功能时,我意识到没有传递有关用户的信息。
我在视图功能中尝试了print request
,但是在服务器终端中打印的消息中没有关于用户的信息,我得到的是一长串系统设置或其他信息。但是,登录应该将刚刚成功登录的人员的信息传递给成功登录URL吗?
非常感谢您的解释。
答案 0 :(得分:4)
登录后,您可以在视图中引用request.user
,在模板中引用{{user}}
来访问用户信息。您需要确保的是,您将HttpResponse
中的RequestContext
传递给将来的请求。
是的,REDIRECT_FIELD_NAME
在django.contrib.auth的__init__.py
中定义,它只是您从登录表单传递的"next"
。
在Django中,有多种方法可以强制用户登录。通过使用@login_required
装饰视图函数,通过调用用户定义的URL等的内置登录视图,请参阅登录设置变量here。你会得到更多的想法。
Building custom login page。该链接为您提供了自定义登录实现的示例。考虑您使用@login_required
修饰了一个视图,其对应的网址是/login_test/
。然后,登录表单中的{{next}}
上下文变量将使用/login_test/
呈现。所以登录后,
<input type="hidden" name="next" value="{{ next }}" />
此元素的值将根据REDIRECT_FIELD_NAME
进行重定向。虽然我怀疑该示例缺少settings.LOGIN_URL
到网址login/
的设置。没关系,它在装饰器本身作为参数传递。
答案 1 :(得分:2)
要覆盖此行为,只需在应用的settings.py
中添加以下内容:
LOGIN_REDIRECT_URL = "/"
这将重定向到您的主页。您可以将此网址更改为首选网址。
答案 2 :(得分:1)