如何在模板标签中获取当前用户?
Posted
技术标签:
【中文标题】如何在模板标签中获取当前用户?【英文标题】:How get current user in a template tag? 【发布时间】:2013-01-26 17:15:20 【问题描述】:如何在 django 模板标签中获取当前用户? (请求对象不可访问) 或者我如何访问请求对象?
【问题讨论】:
您可以将其创建为上下文处理器,而不是创建模板标签并始终在模板中调用它。在上下文处理器中,您无需始终在模板中调用函数即可获取用户。 单行模板标签真的很复杂.. django 真的这么笨拙吗? 或者试着把这个放到你的模板user.username 那你想展示什么?如果它没有用,那么你的问题是不完整的。如果您真的想要帮助,请更具体并提供示例。 问题很清楚,他想在一个模板标签中访问当前用户 【参考方案1】:假设您有每个注册用户的个人资料页面,并且您只想向个人资料页面的所有者显示编辑链接(即,如果当前用户正在访问他/她的个人资料页面,用户可以看到编辑按钮,但用户在其他用户的个人资料页面上看不到编辑按钮。 在您的 html 文件中:
<h2>Profile of object.username </h2>
% if object.username == user.username %
<a href="% url 'profile_update' object.pk %">Edit</a>
% endif %
那么你的 urls.py 文件应该包含:
from django.urls import path
from .views import ProfileUpdateView
urlpatterns = [
...
path('<int:pk>/profile/update', ProfileUpdateView.as_view(), name = 'profile_update'),
...
]
考虑到您有合适的ProfileUpdateView
和合适的型号
【讨论】:
【参考方案2】:这个问题已经answered here:
% if user.is_authenticated %
<p> Welcome ' user.username '</p>
% else %
<a href="% url django.contrib.auth.login %">Login</a>
% endif %
并确保在 settings.py 中安装了请求模板上下文处理器:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.request',
...
)
注意:
在视图中使用request.user.get_username()
,在视图中使用user.get_username
模板。优先于直接引用用户名属性。
Source
如果使用 RequestContext,则此模板上下文变量可用。
django.contrib.auth.context_processors.auth 默认启用并包含变量 user
您不需要启用 django.core.context_processors.request 模板上下文处理器。
来源:https://docs.djangoproject.com/en/dev/topics/auth/default/#authentication-data-in-templates
【讨论】:
【参考方案3】:用户始终附加到请求中,在您的模板中您可以执行以下操作:
% if user.is_authenticated %
% endif %
您不必指定“请求”来访问其内容
更新:
注意:is_authenticated()
始终为登录用户(User
对象)返回 True
,但为 AnonymousUser
(访客用户)返回 False
。在这里阅读:https://docs.djangoproject.com/en/1.7/ref/contrib/auth/
【讨论】:
user.is_authenticated
总是返回 true 所以它基本上没用。
不!它总是为用户(记录的)返回真,但为匿名用户返回假,所以不是没用的!仔细阅读这里:docs.djangoproject.com/en/1.7/ref/contrib/auth【参考方案4】:
如果要在模板标签中访问当前用户,则必须将其作为参数传递给模板,如下所示:
% my_template_tag user %
然后确保您的模板标签接受这个额外的参数。查看有关此主题的 documentation。您还应该查看simple tags。
【讨论】:
以上是关于如何在模板标签中获取当前用户?的主要内容,如果未能解决你的问题,请参考以下文章