使用django.contrib.auth无法在模板中获取用户

时间:2017-02-09 09:47:14

标签: django django-models django-templates django-views

我做错了什么?我只想要用户的用户名。我被记录了所以我不知道它为什么不起作用。

views.py

from django.contrib.auth.models import User

def check_user(request):
    data = dict()
    user = User.objects.all()
    data['user'] = user
    return render(request, 'check_user.html', data)

urls.py

url(r'^check_user/$', views.check_user, name='check_user'),

check_user.html

{{ request.user.is_authenticated }}

{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

我得到了这个:

CallableBool(True)

Welcome, new user. Please log in.

当我得到:

Welcome, admin. Thanks for logging in.

如果我使用:{%if request.user.is_authenticated%}而不是{%if user.is_authenticated%}我得到了这个:

Welcome, . Thanks for logging in.

2 个答案:

答案 0 :(得分:2)

user是模板中的queryset对象,换句话说,它是用户列表,而不是单个用户。 如果您需要当前用户,请使用:

{% if request.user.is_authenticated %}
    <p>Welcome, {{ request.user.username }}. Thanks for logging in.</p>

而不是

{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>

<强>更新

正如威尔弗里德在回答和评论中所说,在模板中覆盖变量user并不是一个好习惯。因此,如果您需要视图中的用户列表,最好将上下文变量重命名为users

users = User.objects.all()
data['users'] = users

答案 1 :(得分:2)

您的问题在您看来,您不需要创建数据['user']。因为在模板中,Django已经传递了模板变量{{ user }}

因此,在您的视图中删除此数据dict,并保留当前上下文,而不进行修改。

def check_user(request):
    return render(request, 'check_user.html', {})

您的模板将有效。 (不需要改变什么)

{% if user.is_authenticated %}
    <p>Welcome, {{ user.username }}. Thanks for logging in.</p>
{% else %}
    <p>Welcome, new user. Please log in.</p>
{% endif %}

https://docs.djangoproject.com/en/dev/topics/auth/default/#authentication-data-in-templates