2017-01-01 75 views
0

我有我的用戶配置文件模型現場,看是否有用戶:重定向Django的所有意見,如果條件滿足

class Profile(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True) 
    ... 
    password_change_required = models.BooleanField(default=True) 

是他們的一種方式我也可以把所有的觀點是這樣的:

if request.user.profile.password_change_required: 
    redirect(....) 

我在哪裏可以把這個邏輯,所以它擊中所有的意見?

回答

3

使用Middleware

在請求階段,調用視圖之前,Django的應用在它的中間件定義的順序 中間件, 自頂向下。

你可以把它想象成一個洋蔥:每個中間件類都是一個「層」 ,它包裝了視圖,這是洋蔥的核心。如果請求 通過洋蔥的所有層(每一個調用 get_response將請求傳入下一層),一路以 爲核心的視圖,則響應將通過每一層 (以相反的順序)在返回的路上。

如果這些層中的一個決定短路並返回響應 而沒有調用其get_response,沒有洋蔥 的層的那層(包括圖)的內部將看到請求或 響應。響應只會通過請求傳入的相同圖層返回。

只要您的訂購是正確的(例如認證中間件如此request.user可用),哪個應該做你想要的。

0
class ProfileUpdateView(UpdateView): 

def get(self, request, *args, **kwargs): 
    if not request.user.profile.password_change_required: 
     return super(ProfileUpdateView, self).get(request, *args, **kwargs) 
    else: 
     return redirect('/accounts/change-password/?next=%s' % request.path) 

確保你也導入重定向

from django.shortcuts import redirect 
+0

這不會影響ProfileUpdateView嗎? – 43Tesseracts

+0

是的。它只會影響ProfileUpdateView。如果你想應用它所有的通用視圖類,你可能必須使用Mixins –

+0

正如問題所述,我希望它適用於所有視圖。 – 43Tesseracts