ChatGPT解决这个技术问题 Extra ChatGPT

如何访问 Django 模板中的用户配置文件?

我正在使用 AUTH_PROFILE_MODULE 存储一些额外的每用户信息。

我们可以使用 {{ request.user }} 在 Django 模板中访问用户,但是我们如何访问配置文件中的字段,因为配置文件只能通过函数 user.get_profile() 访问?

是否真的需要每次都将配置文件显式传递到模板中?


A
AdamKG

使用 {{ request.user.get_profile.whatever }}。 Django 的模板语言会自动调用可调用的东西——在本例中是 .get_profile() 方法。


这在 Django 1.5 及更高版本中已弃用,并且在 Django 1.7 及更高版本中不起作用。有关如何在现代 Django 中执行此操作,请参阅 Sacha Rau 的答案。
R
Rachel

不知道为什么它对我不同,但我需要使用 {{user}} 而不是 {{request.user}}。


正如您所说,文档说 (docs.djangoproject.com/en/dev/topics/auth/…) 您可以通过 {{user}} 访问用户。
使用 {{user}} 而不是 {{request.user}} 的真正原因是您没有包含请求的模板上下文处理器。 https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request
Django 1.10 的链接略有不同,但思路相同,django.template.context_processors.request 在模板中插入 request,而 django.contrib.auth.context_processors.auth 在上下文中插入 userdocs.djangoproject.com/en/1.10/ref/templates/api/…
M
Mariusz Jamro

是的,可以使用 request.user.get_profile 从模板访问配置文件

但是有一个小警告:并非所有用户都有个人资料,在我的情况下是管理员用户。因此,在这种情况下,直接从模板调用 {{ request.user.get_profile.whatever }} 会导致错误。

如果您确定所有用户始终拥有配置文件,则可以安全地从模板调用,否则从视图中的 try-except 块中调用 get_profile() 并将其传递给模板。


这个答案具有误导性 - 我没有测试 {{ request.user.get_profile.whatever }},但 {{ request.user.get_profile }} 可以工作并且可用于检查当前版本中是否存在配置文件。请参阅docs.djangoproject.com/en/dev/ref/templates/api/…。不过,有一个注意事项,这将在开发版本中发生变化,请参阅我链接到的上面的段落。
@tkolar,这里到底有什么误导?如果用户没有个人资料并且您正在调用 get_profile.something 会导致错误。
C
Community

如果它对任何人有帮助,我在模板中使用了以下内容:

用户名:{{ user.username }}

用户全名:{{ user.get_full_name }}

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

电子邮件:{{ user.email }}

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

示例结果如下:

用户:auditor ezio 用户组:auditGroup 用户名:testUser03 电子邮件:testuser03@auditor.com 会话开始于 - 2018 年 4 月 16 日,晚上 9:38

谢谢 :)


M
MichielB

如果您使用的是 Django > 1.5 你不能再使用get_profile

如果您有旧版应用程序,则应从 settings.py 中删除 AUTH_PROFILE_MODULE = 'myapp.profile'

如果您在 Profile 类中使用 models.OneToOneField(User),您可以简单地使用

{{ request.user.profile.whatever }}

在你的 Django 模板中


@AlexStewart 你的意思是我们不再需要前面的 request 键盘?
N
Nids Barthwal

在职的 !

在您的个人资料模型中提供related_name

user = models.OneToOneField(AUTH_USER_MODEL, related_name="user_profile", on_delete=models.CASCADE)

然后在模板中使用。这里 company_name 是配置文件表中的字段

{{ request.user.user_profile.company_name }}