使用RequestContext时,Django Context包含未定义的字段

时间:2012-10-17 10:02:43

标签: django django-templates django-views

您好我正在写一个django项目,我写这样的模板代码:

            <ul id="nav">
                <li><a href="/">Home</a></li>
                <li><a href="/user/">Users</a></li>
                {% if user %}
                    <li><a href="/user/{{ user.id }}/">Settings</a></li>
                    <li><a href="/logout/">Log Out</a></li>
                {% else %}
                    <li><a href="/login/">Log In</a></li>
                    <li><a href="/signup/">Sign Up</a></li>
                {% endif %}
            </ul>

现在在登录视图中,我这样写:

def login(request):
    if user_logged_in(request):
        return redirect('/')
    if request.method == 'GET':
        form = LogInForm()
        return render_to_response(LOGIN_PATH, {'form':form}, context_instance=RequestContext(request))

但是当我运行服务器时,没有用户登录,并访问登录页面,它显示设置和注销(上下文中有一个用户对象),但它不应该!

如果我删除RequestContext,请回复render_to_response(LOGIN_PATH,{'form':form}),就可以了。和

return render_to_response(LOGIN_PATH, {'form':form, 'user':None}, context_instance=RequestContext(request))

也可以。但我不想这样做。

我知道这是肮脏的设计,嗯......我正在寻找建议和解决方案。非常感谢〜!

2 个答案:

答案 0 :(得分:1)

{% if user.is_authenticated %}

您的标记只检查用户对象,而不是经过身份验证的用户对象。

检查here以获取有关使用auth用户可以执行的操作的更多信息:)

答案 1 :(得分:0)

TEMPLATE_CONTEXT_PROCESSORS的默认设置包括"django.contrib.auth.context_processors.auth"。此上下文处理器将user添加到cotnext,如果请求中未提供用户,则将是匿名的。

如果您希望能够知道用户是否在模板中进行了身份验证,那么@Samuele Mattiuzzo答案就是您应该使用的答案,但如果您不希望出于任何原因将用户包含在上下文中,那么你需要在没有auth上下文处理器的情况下修改默认的TEMPLATE_CONTEXT_PROCESSORS设置。

有关详情read the docsthe code