2010-06-21 62 views
-1

我正在使用base.html模板页面上的登录框开发一个站点。对于需要用户登录的所有页面,我使用login_required装饰器。不过,我希望用户能够在其他页面上登录,如果他们想。Django的login_optional装饰器?

其中的“login_required”装饰做的事情是处理登录,除了验证你显示你所期望的页面之前登录的螺母和螺栓。

我想什么是这些可选页面的“login_optional”装饰(或login_required内可选参数)。我找不到这样的事情。它是否存在,我只是想念它,或者我是否需要为这些视图推出我自己的登录处理例程?

由于

麦克
EDIT(示例代码)
模板

<form action="" method="post"> 
    <label for="username">Username:</label> 
    <input type="text" name="username" value="" id="username" size="10"/> 
    <label for="password">Password:</label> 
    <input type="password" name="password" value="" id="password" size="10"/> 
    <input type="submit" value="Login"/> 
    <input type="hidden" name="next" value="{{ next|escape }}"/> 
</form 

>

需要登录码

@login_required 
def chooseDistributor(request): 
    user = request.user 
    # blah stuff deleted 
    # NOTHING TO HANDLE request.POST! 
    return render_to_response('choose_distributor.html',locals()) 

登录可选代码

def showWelcome(request): 
    user = request.user 
    return render_to_response('welcome/home.html',locals()) 

回答

2

你是什么意思? login_optional只是一个没有login_required装饰器的视图...:p。

注意,login_required装饰不处理任何登录功能,如果用户通过控制请求上下文的用户对象记录在它只是检查。如果他/她未登录,则此装饰器将重定向到保存真实登录功能的页面。

所以装饰只是一个检查+重定向,使得登录可选的页面,因此只是去掉装饰。

+0

参见上面的编辑。总之,我假设login_required装饰器处理来自登录表单的POST响应。当然,没有装饰器和没有任何其他POST处理代码的页面将无法处理登录操作。 虽然我可以简单地将适当的代码从login_required装饰复制,这违反了DRY原则,所以我问我的问题。 – jamida 2010-06-22 20:28:43

+0

不,登录装饰器不包含该登录POST处理代码,只有登录页面会执行该操作。但是,任何写得很好的登录页面都会将您重定向回使用登录装饰器的视图。真的,login_required装饰器不包含任何登录处理代码:p。 – KillianDS 2010-06-22 21:17:13

+0

是的,我现在看了,明白了...... >>脸红“谢谢。 – jamida 2010-06-22 21:39:00