我很新的ατDjango。我一直在尝试为我的应用程序开发用户身份验证。我为表单使用AuthenticationForm
,为登录视图使用FormView。我还构建了一个自定义后端,使用电子邮件地址而不是用户名对用户进行身份验证。身份验证似乎工作正常,因为它在提供正确的电子邮件和密码时返回用户对象,否则显示错误。 form_valid()
将我带到了'success_url
'。但是当我尝试访问名称或电子邮件等用户属性时,我无法在模板中访问它们(success_url)。并且user.is_authenticated
似乎返回False。可能有什么不对?我花了好几个小时试图解决这个问题,但还没有成功。我非常感谢您的指导和建议。提前谢谢。
这是我的LoginView:
类LoginView(FormView):
form_class = AuthenticationForm
success_url = "hello/"
#redirect_field_name = REDIRECT_FIELD_NAME
template_name = 'draint_user/login.html'
@method_decorator(csrf_protect)
@method_decorator(never_cache)
def dispatch(self, *args, **kwargs):
return super(LoginView, self).dispatch(*args, **kwargs)
def form_valid(self, form):
"""
The user has provided valid credentials (this was checked in AuthenticationForm.is_valid()). So now we
can check the test cookie stuff and log him in.
"""
self.check_and_delete_test_cookie()
user = form.get_user()
login(self.request, user)
print form.get_user().name
return super(LoginView, self).form_valid(form)
def form_invalid(self, form):
"""
The user has provided invalid credentials (this was checked in AuthenticationForm.is_valid()). So now we
set the test cookie again and re-render the form with errors.
"""
self.set_test_cookie()
return super(LoginView, self).form_invalid(form)
def get_success_url(self):
if self.success_url:
redirect_to = self.success_url
else:
redirect_to = self.request.REQUEST.get(self.redirect_field_name, '')
netloc = urlparse.urlparse(redirect_to)[1]
if not redirect_to:
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
# Security check -- don't allow redirection to a different host.
elif netloc and netloc != self.request.get_host():
redirect_to = resolve_url(settings.LOGIN_REDIRECT_URL)
return redirect_to
def set_test_cookie(self):
self.request.session.set_test_cookie()
def check_and_delete_test_cookie(self):
if self.request.session.test_cookie_worked():
self.request.session.delete_test_cookie()
return True
return False
def get(self, request, *args, **kwargs):
"""
Same as django.views.generic.edit.ProcessFormView.get(), but adds test cookie stuff
"""
self.set_test_cookie()
return super(LoginView, self).get(request, *args, **kwargs)
以下是success_url的视图:
def hello(request):
return render(request,"draint_user/hello.html",{})
这是我的hello.html(模板)
<body>
{% if user.is_authenticated %}
<p>Welcome, {{ user.get_username }}. Thanks for logging in.</p>
{% else %}
<p>Welcome, new user. Please log in.</p>
{% endif %}
</body>
答案 0 :(得分:1)
默认情况下,模板上下文中没有user
。您可以手动添加它,也可以通过激活django.core.context_processors.request
上下文处理器将整个请求添加到上下文中。
回应评论:
您可以在视图中定义get_context_data
,将user
对象添加到您的上下文中:
def get_context_data(self, **kwargs):
# getting default context for view
context = super(LoginView, self).get_context_data(**kwargs)
# adding user into context
context['user'] = self.request.user
# returning new context
return context
您可以编辑settings.py文件并添加
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
"django.core.context_processors.static",
"django.core.context_processors.tz",
"django.contrib.messages.context_processors.messages",
"django.core.context_processors.request",
)
(这是来自django 1.7的默认TEMPLATE_CONTEXT_PROCESSORS
并添加了django.core.context_processors.request
)或者如果您已在设置中定义TEMPLATE_CONTEXT_PROCESSORS
,只需将django.core.context_processors.request
添加到其中。现在,您可以在每个模板中访问request.user
。
答案 1 :(得分:0)
实际上,请从这里阅读:https://docs.djangoproject.com/en/1.7/topics/http/shortcuts/#render
render()与使用context_instance参数调用render_to_response()相同,后者强制使用RequestContext。
因此,您可以尝试在模板中以request.user
的形式访问用户对象