2012-08-05 17 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'),