2009-10-30 73 views
1

我有一種情況,需要將已經登錄的用戶從登錄頁面重定向到另一個頁面。我已經看到提到這可以用裝飾器來完成,這是合理的,但我對使用它們相當新。不過,我正在使用django登錄和第三方視圖(來自django註冊)。我不想更改django.contrib.auth或django-registration中的任何代碼。我怎樣才能將裝飾器應用於不被修改的視圖以獲得所需的行爲。用裝飾器覆蓋Django的意見

在此先感謝!

更新:我發現我錯誤地將登錄功能與註冊模塊相關聯。 Django註冊與這個問題無關。不過,我仍然需要能夠覆蓋默認的login()行爲。有什麼想法嗎?

回答

6

三種更多的方式來做到這一點,但你需要使用自己的URLconf這些:

  1. 裝飾添加到視圖直接在URL配置:

    ... 
    (regexp, decorator(view)), 
    ... 
    

    你需要將視圖和裝飾器導入到urlconf中,這就是爲什麼我不喜歡這個。我更願意在我的urls.py中儘可能減少進口。

  2. 導入的觀點爲<app>/views.py,並添加裝飾有:

    import view 
    
    view = decorator(view) 
    

    很像維奈的方法雖然比較明確的,因爲你需要爲它的URL配置。

  3. 裹在一個新的觀點認爲:當你需要改變通用視圖

    import view 
    
    @decorator 
    def wrapperview(request, *args, **kwargs): 
        ... other stuff ... 
        return view(request, *args, **kwargs) 
    

    最後一個是非常方便的。無論如何,這是我最終做的事情。

無論何時您使用urlconf,模式順序都很重要,因此您可能需要隨機調用哪個模式先被調用。

+0

正是醫生所訂購的 - #3。不錯的工作。 – 2009-10-30 14:07:51

2

如果你有裝飾功能,你知道你想裝飾它查看Django的註冊,你可能只是做

registration.view_func = decorator_func(registration.view_func) 

其中registration是在Django註冊包含您的視圖功能模塊想要裝飾,view_func您要裝飾的視圖功能,並且decorator_func是裝飾者。

+2

但是,哪一個是最好的文件呢? ;) – kaleissin 2009-10-30 12:25:20