Django 1.4 - request.user.username 不在模板中呈现

Posted

技术标签:

【中文标题】Django 1.4 - request.user.username 不在模板中呈现【英文标题】:Django 1.4 - request.user.username doesn't render in templateDjango 1.4 - request.user.username 不在模板中呈现 【发布时间】:2012-04-26 21:10:50 【问题描述】:

在我看来,我可以打印 request.user.username,但是在模板中,request.user.username 没有出现。为了简单起见,我从函数中删除了逻辑,并导入了 render_to_response 和 RequestContext。

from django.shortcuts import render_to_response
from django.template import RequestContext

@login_required
@csrf_protect
def form(request):
    print request.user.username
    data = 
    return render_to_response('form.html', data, context_instance=RequestContext(request))   

我的猜测是我的 settings.py 有问题。

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    # Uncomment the next line for simple clickjacking protection:
    # 'django.middleware.clickjacking.XFrameOptionsMiddleware',

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django.contrib.admin',
    'django.contrib.admindocs',
    'src',
)

提前感谢您的帮助-

【问题讨论】:

【参考方案1】:

作为mentioned in the documentation,经过身份验证的用户对象存储在模板中的user 变量中。提及的文档包括以下示例:

在渲染模板RequestContext时,当前登录的用户,无论是User实例还是AnonymousUser实例,都存储在模板变量 user 中:

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

编辑:感谢@buffer,他挖出了这个旧答案,我已经用最新状态更新了它。最初写的时候,在 Django 1.4(2012 年 3 月末发布)之后不到一个月的时间里,它是正确的。但是从 Django 1.5 开始,获取用户名的正确方法是在用户模型实例上调用 get_username()。由于能够交换 User 类(并具有自定义字段作为用户名),因此添加了此功能。

【讨论】:

我可以将用户对象传递给模板,但不应该通过请求访问登录用户吗?似乎无法从模板访问请求,但在视图中。 很有趣。这是正确的 - 而不是 request.user.username (我在以前的项目中使用过),user.username 有效。感谢@tadeck 的帮助! 最好使用user.get_username 而不是user.username : docs.djangoproject.com/en/dev/ref/contrib/auth/… @buffer:没错,但它是在 Django 1.5 中添加的,而答案是在 Django 1.4 发布后不到一个月的时间里写的。将添加适当的注释。【参考方案2】:

查看RequestContext 和TEMPLATE_CONTEXT_PROCESSORS 的文档。

如果您希望request 出现在您的模板上下文中,那么您需要在您的TEMPLATE_CONTEXT_PROCESSORS 设置中包含django.core.context_processors.request。默认情况下它不存在。

但是,正如 Tadeck 在他的回答中指出的那样,如果您使用默认设置,user 已经可用,因为 django.contrib.auth.context_processors.authTEMPLATE_CONTEXT_PROCESSORS 的默认列表的一部分。

【讨论】:

感谢布赖恩的澄清。那是我丢失的信息。 TEMPLATE_CONTEXT_PROCESSORS 是否从默认项目中删除?我可能只是忘记了我添加了它们,但已经有一段时间了。 @EmilePetrone 我认为当前的 startproject 命令不会创建带有 TEMPLATE_CONTEXT_PROCESSORS 的 settings.py。可能有一次,但我不确定。 @BrianNeal:我不想将用户传递给模板。有没有办法永久禁用它? @user1050619 是的,定义您自己的 TEMPLATE_CONTEXT_PROCESSORS 并且不包括身份验证或请求处理器。

以上是关于Django 1.4 - request.user.username 不在模板中呈现的主要内容,如果未能解决你的问题,请参考以下文章

装饰所有 django 管理视图 (1.4+)

用户注册后Django自动登录(1.4)

更新到 1.4 后的 Django syncdb 异常

将 CMS 2.3 与 Django 1.4 集成

django admin 静态文件在升级到 1.4 后停止工作

将文件夹和文件结构从 django 1.3 迁移到 django 1.4 的最佳方法是啥?