如何在Django模板中访问用户资料?

94

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

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

每次都需要显式地将配置文件传递到模板中吗?这是必需的吗?

6个回答

141
使用 {{ request.user.get_profile.whatever }}。Django的模板语言会自动调用可调用的东西 - 在这种情况下,是.get_profile()方法。

3
请参阅http://docs.djangoproject.com/en/dev/topics/templates/#variables,这些规则很不错。 - S.Lott
3
在 Django 1.5 及以上版本中,此方法已被弃用,在 Django 1.7 及以上版本中不可用。请查看 Sacha Rau 的回答以了解如何在现代 Django 中执行此操作。 - MichielB

28

不确定为什么会有不同,但我需要使用{{user}}而不是{{request.user}}。


5
文档(http://docs.djangoproject.com/en/dev/topics/auth/#authentication-data-in-templates)中提到,你可以像你所说的那样通过{{user}}来访问用户。 - Xiong Chiamiov
2
使用{{user}}而不是{{request.user}}的真正原因是因为您没有为请求包含模板上下文处理器。[https://docs.djangoproject.com/en/dev/ref/templates/api/#django-core-context-processors-request] - knightZeRo
6
对于 Django 1.10,链接略有不同,但思路是相同的,django.template.context_processors.requestrequest 插入到模板中,而 django.contrib.auth.context_processors.auth 则将 user 插入到上下文中。参考链接:https://docs.djangoproject.com/en/1.10/ref/templates/api/#django-template-context-processors-request - Andrei-Niculae Petre

8

是的,可以使用 request.user.get_profile 从模板访问个人资料。

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

如果您确定所有用户都有个人资料,则可以安全地从模板调用,否则请在视图中使用try-except块调用get_profile()并将其传递到模板中。


这个答案是误导性的 - 我没有测试过 {{ request.user.get_profile.whatever }},但是 {{ request.user.get_profile }} 可以工作,并且可以用来检查当前版本中是否存在配置文件。请参见 http://docs.djangoproject.com/en/dev/ref/templates/api/#how-invalid-variables-are-handled 。不过需要注意的是,在开发版本中会有所改变,请参见我链接上面的段落。 - ralokt
@tkolar,这里到底哪里有误导性?如果用户没有配置文件,并且您正在调用get_profile.something,那么将会引发一个错误。 - Sergey Golovchenko

5
如果有帮助的话,我在我的模板中使用了以下内容:
用户名:{{ user.username }} 用户全名:{{ user.get_full_name }} 用户组:{{ user.groups.all.0 }} 电子邮件:{{ user.email }} 会话开始于:{{ user.last_login }} 一个示例结果如下:

用户:审计员Ezio

用户组:审计组

用户名:testUser03

电子邮件:testuser03@auditor.com

会话开始于- 2018年4月16日晚上9:38。

感谢您的阅读。

4

如果您使用的是Django > 1.5版本,则不能再使用get_profile

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

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

{{ request.user.profile.whatever }}

在您的Django模板中


1
@AlexStewart,你的意思是我们前端不再需要“request”键盘了吗? - Luk Aron

1

工作中!

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

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

然后在模板中使用。这里的company_name是profile表中的字段。

{{ request.user.user_profile.company_name }}

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