62

从 django 模板获取用户信息的最佳方法是什么?

例如,如果我只想:

  1. 如果用户已登录,则显示“欢迎 [用户名]”
  2. 否则,显示登录按钮。

我正在使用 django-registration/authentication

4

5 回答 5

112

当前 Django 版本的另一种方法:

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


笔记:

  • request.user.get_username()在视图和user.get_username模板中使用。优先于username直接引用属性。来源
  • 如果使用 RequestContext,则此模板上下文变量可用。
  • django.contrib.auth.context_processors.auth默认启用并包含变量用户
  • 您不需要启用django.core.context_processors.request模板上下文处理器。

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

于 2014-04-06T09:32:11.030 回答
45
{% if request.user.is_authenticated %}Welcome '{{ request.user.username }}'
{% else %}<a href="{% url django.contrib.auth.login %}">Login</a>{% endif %}

并确保您的request模板上下文处理器安装在您的settings.py

TEMPLATE_CONTEXT_PROCESSORS = (
    ...
    'django.core.context_processors.request',
    ...
)
于 2012-12-04T22:34:45.447 回答
28

根据问题标题,以下内容可能对某人很方便。在我的模板中使用了以下内容:

用户名{{ user.username }}

用户全名{{ user.get_full_name }}

用户组{{ user.groups.all.0 }}

电子邮件{{ user.email }}

会话开始于{{ user.last_login }}

谢谢 :)

于 2018-04-16T16:34:33.380 回答
1

首先,首先,如果您的字段更改了名称,您必须以这种方式覆盖函数(get_full_name()、get_short_name() 等):

def get_full_name(self):
    return self.names + ' ' + self.lastnames

def get_short_name(self):
    return self.names

在模板中,你可以这样显示

{% if user.is_authenticated %}
<strong>{{ user.get_short_name }}</strong>
{% endif %}

这些是身份验证中的方法https://docs.djangoproject.com/es/2.1/topics/auth/customizing/

于 2018-10-22T03:42:57.823 回答
0

以下是一个完整的工作解决方案,它也考虑了翻译:

template.html

{% blocktrans %}Welcome {{ USER_NAME }}!{% endblocktrans %}

context_processors.py

def template_constants(request):
    return {
        'USER_NAME': '' if request.user.is_anonymous else request.user.first_name,
        # other values here...
    }

提醒在以下位置正确设置您的自定义 context_processors settings.py

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'your_app.context_processors.template_constants',
            ],
        },
    },
]

这就是你得到的django.po

#: templates/home.html:11
#, python-format
msgid "Hi %(USER_NAME)s!"
msgstr "..."

一个好的做法是将逻辑保留在模板之外:为此,您可以轻松自定义直接在context_processors.py.

于 2021-11-12T16:14:59.873 回答