在我看来,我可以打印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',
)
提前感谢您的帮助 -
答案 0 :(得分:40)
作为mentioned in the documentation,经过身份验证的用户对象存储在模板中的user
变量中。提到的文档包括以下示例:
在呈现模板
RequestContext
时,当前登录的用户(User
实例或AnonymousUser
实例)存储在模板变量{{ user }}
中:< / p>
{% 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
类(并将自定义字段作为用户名),因此添加了此内容。
答案 1 :(得分:5)
查看RequestContext和TEMPLATE_CONTEXT_PROCESSORS的文档。
如果您希望request
出现在模板上下文中,则需要在django.core.context_processors.request
设置中加入TEMPLATE_CONTEXT_PROCESSORS
。它默认不存在。
然而,正如Tadeck在他的回答user
中指出的那样,如果您使用的是默认设置,那么django.contrib.auth.context_processors.auth
已成为TEMPLATE_CONTEXT_PROCESSORS
默认列表的一部分。