2012-08-05 45 views
1

我用另一个函数包装了django.contrib.auth.views.logout以添加其他行为。这是我的新logout_page:在Django中添加代码以注销视图的正确方法

views.py

from django.contrib.auth import logout 
def logout_page(request, *args, **kwargs): 
    from django.utils import timezone 
    user = request.user 
    profile = user.get_profile() 
    profile.last_logout = timezone.now() 
    profile.save() 
    logout(request, *args, **kwargs) 

urls.py

(r'^logout/$', 'main.views.logout_page', {'next_page': '/'}) 

但我发现了以下错误:

logout() got an unexpected keyword argument 'next_page' 

我不确定为什么是'nex t_page'当注销包含** kwargs时的一个意外的参数,据我所知,从django.contrib.auth注销应该包含这样的参数。从来源:

https://github.com/django/django/blob/master/django/contrib/auth/views.py

def logout(request, next_page=None, 
      template_name='registration/logged_out.html', 
      redirect_field_name=REDIRECT_FIELD_NAME, 
      current_app=None, extra_context=None): 
... 

我该如何解决这个问题?

回答

6

你打错了logout

from django.contrib.auth import logout 

应该

from django.contrib.auth.views import logout 
+0

哦,你是对的。我没有收到错误。我想我正在使用正确的导入,除了在我看来。谢谢! – 2012-08-05 05:24:30

1

你应该从意见,from django.contrib.auth.views import logout进口替代from django.contrib.auth import logout注销。

在旁边注意,对于这种行为你可能想要使用注销信号。请参阅login logout signals

+0

很棒的建议,但我认为它会由于我不能在没有中间件的信号中使用request.user而变得复杂,对吧? – 2012-08-05 05:45:42

+0

@RobertSmith相关用户作为参数传递给信号接收器,因此您不需要访问'request.user'。 – 2012-08-05 05:48:58

+0

@isbadawi作为发件人? – 2012-08-05 06:05:10

0

我得到了同样的问题,因为你并用这个简单的解决方法:

views.py:

def my_logout(request): 
    # Staff you want to do before logout 
    from django.http import HttpResponseRedirect 
    return HttpResponseRedirect("/logout2/") 

urls.py:

(r'^logout/$', 'views.my_logout'), 
url(r'^logout2/$', 
    django.contrib.auth.views.logout, 
    {'template_name': 'logged_out.html'}, # Next page 
    name='auth_logout'),