在Django中如何获取已登录用户的用户名?

88
如何在Django应用程序中获取关于已登录用户的信息?
例如:
我需要知道已登录用户的用户名,以便在评论中标明是谁发表的。
<form id='formulario' method='POST' action=''>
    <h2>Publica tu tuit, {{ usuario.username.title }} </h2>
    {% csrf_token %}
    {{formulario.as_p}}
    <p><input type='submit' value='Confirmar' /></p>
</form>

usuario.username.title中,我可以获取用户名,但是在模板中,我需要从视图中获取这些信息。

usario 是用户对象还是用户资料对象? - karthikr
是的,这是个用户资料,但我需要在视图中获取用户名以保存到模型中。=) - Cris Towi
好的。检查答案。这是如何从视图中访问用户名。 - karthikr
10个回答

125
您可以使用请求对象来查找已登录的用户。
def my_view(request):
    username = None
    if request.user.is_authenticated():
        username = request.user.username
根据https://docs.djangoproject.com/en/2.0/releases/1.10/,Django 2.0版本的语法已经改变为:
request.user.is_authenticated

如果 request.user.is_authenticated() 报错 TypeError: 'bool' object is not callable,你能帮忙解决吗?Django 3.2。 - Mr Coder

49

request.user.get_username() 或者 request.user.username,建议使用前者。

Django 文档中指出:

由于用户模型可以被替换,所以应当使用这个方法而不是直接引用 username 属性。

附:在模板中,请使用 {{ user.get_username }}


13

'request.user' 表示已登录的用户。
'request.user.username' 将返回已登录用户的用户名。


这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - Sathish
它将返回用户对象。您可以从此对象中获取一些用户属性。 - ancho

12

对于基于类的视图,请使用self.request.user.id


请求方法的参数,我只是举例使用了request.user.id。 - Ricardo G Saraiva

6
你可以使用以下代码获取已登录用户的用户名:-
只需在模板中写入以下内容。
{{ request.user.username }}

3

如果您正在使用旧的视图编写方式,以Function-Based-Views的方式...

在您的视图中,您创建了一个名为usuario的新变量来保存request.user...

但是,如果您返回一个context_instanceTemplate,并传递请求上下文的值,通过访问request,您将获得已登录的用户。

// In your views file
from django.shortcuts import render_to_response
from django.template import RequestContext
def your_view(request):
    data = {
        'formulario': Formulario()
        # ...
    }
    return render_to_response('your_template.html',
        data, context_instance=RequestContext(request))


// In your template
<form id='formulario' method='POST' action=''>
    <h2>Publica tu tuit, {{ request.user.username.title }} </h2>
    {% csrf_token %}
    {{ formulario.as_p }}
    <p><input type='submit' value='Confirmar' /></p>
</form>

要使用此功能,您必须在settings.py中安装request template context processor请参阅此链接 - ray6080
“Function-Based-Views…” 是编写视图的旧方式吗? - Gathide
嗨@Gathide,是的。如果您看到这个答案是来自2013年...那时候基于类的视图并不是很流行,现在请求处理器在模板上非常标准,您可以直接使用{{ request.user.username }}。我建议您阅读以下内容:https://docs.djangoproject.com/en/4.0/topics/class-based-views/intro/ - Luan Fonseca

2

request.user.get_username()将返回用户电子邮件的字符串。

request.user.username将返回一个方法。


2

通过这种方式,您可以检查用户是否已登录。如果是,则可以转到个人资料页面;如果没有,则返回登录页面。

def profile(request):
    try:
        if request.user.username in User:
            return render(request, "profile.html", {'username': request.user.username})
    except:
        return redirect("/accounts/login")

0
您可以在 Django 视图中使用 HttpRequest.userget_user(request) 来获取已登录用户的用户名,如下所示:
# "views.py"

from django.shortcuts import render
from django.contrib.auth import get_user # Here

def test(request):
    print(request.user.username) # John
    print(get_user(request).username) # John
    return render(request, 'index.html')

在Django模板中,你可以通过以下方式获取已登录用户的用户名:
{% "index.html" %}

{{ user }} {% John %}
{{ user.username }} {% John %}
{{ user.get_username }} {% John %}

-1

关于模板,您可以使用

{% firstof request.user.get_full_name request.user.username %}

firstof函数将返回第一个不为空的参数,否则返回第二个参数


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接