用户未登录。模板无法访问用户属性

时间:2015-03-11 11:01:26

标签: django authentication login

我很新的ατ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>

2 个答案:

答案 0 :(得分:1)

默认情况下,模板上下文中没有user。您可以手动添加它,也可以通过激活django.core.context_processors.request上下文处理器将整个请求添加到上下文中。

回应评论:

  1. 您可以在视图中定义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
    
  2. 您可以编辑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",
    )
    
  3. (这是来自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的形式访问用户对象