0

嗨,我正在编写一个 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,说 return render_to_response(LOGIN_PATH, {'form':form}),就可以了。和

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

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

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

4

2 回答 2

1
{% if user.is_authenticated %}

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

在此处查看有关您可以使用身份验证用户做什么的更多信息:)

于 2012-10-17T10:08:02.880 回答
0

TEMPLATE_CONTEXT_PROCESSORS包括的默认设置"django.contrib.auth.context_processors.auth"。这个上下文处理器user向 cotnext 添加了一个,如果请求中没有提供用户,它将是匿名的。

如果您想知道用户是否在模板中经过身份验证,您应该使用@Samuele Mattiuzzo 答案,但如果您出于任何原因不想将用户包含在上下文中,那么您需要修改默认的 TEMPLATE_CONTEXT_PROCESSORS 设置而不使用 auth 上下文处理器。

有关更多信息,请阅读文档代码

于 2012-10-17T10:14:47.550 回答