9

在我看来,我可以打印 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',
)

在此先感谢您的帮助-

4

2 回答 2

40

文档中所述,经过身份验证的用户对象存储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类(并具有自定义字段作为用户名),因此已添加此功能。

于 2012-04-15T01:34:43.077 回答
5

查看RequestContextTEMPLATE_CONTEXT_PROCESSORS的文档。

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

但是,正如 Tadeck 在他的回答中指出的那样,user如果您使用默认设置,则已经可用,因为django.contrib.auth.context_processors.auth它是TEMPLATE_CONTEXT_PROCESSORS.

于 2012-04-15T01:50:00.717 回答