2012-10-27 26 views
0
執行的功能在多個視圖

所以我仍然在Django的新手,我想有你關於這點建議:在Django

我有我的應用程序用戶系統從userena延伸:

class FindUrGeekUserProfile(UserenaBaseProfile): 
user   = models.OneToOneField(User, unique = True, verbose_name ='userData', related_name='myProfile',db_index = True) 
type   = models.CharField(max_length = 2, choices = USER_TYPE, blank = True, null = True, db_index = True) 

def __unicode__(self): 
    return 'Name: ' + self.user.username + ' Type: ' + self.type 

當用戶在我的網站註冊時,他完成登錄,密碼和電子郵件字段。

的用戶第一次將連接雖然我的網站,他會看到一個頁面,詢問他什麼是他的用戶類型:類型1或2型...

我想在每個login_registered以驗證用戶已經定義了類型。到現在爲止,我創建了一個功能,我在每一個註冊的視圖中使用:

def checkUserType(user): 
    if(user.type != None) 
     return True 
    else: 
     retur False 

@login_registered 
def myView(request): 
    if (checkUserType(request.user)): 
     Continue.... 
    else: 
     return redirect('setUserType') # Page where the user will set his type 

是否有在Django的一個更好的辦法?使用一些內置函數?

的幫助

+0

如果你想要一個值,爲什麼'blank'和'null'爲true? –

+0

我不知道爲什麼你想要不同的功能來檢查一個標誌/值? – Rohan

回答

0

謝了歐有至少一種更好的方式:

@login_registered 
def myView(request): 
    if not checkUserType(request.user): 
     return redirect('setUserType') # Page where the user will set his type 

    # user has the type, continue 

此外,您可以write a custom middleware,並做檢查/重定向process_request()。它可能看起來像:

from django import http 
from django.core.urlresolvers import reverse 


class SetUserTypeMiddleware(object): 
    urls = ['/some/path/that/requires/user/type/',] 

    def process_request(self, request): 
     if not request.user.is_authenticated(): 
      return 

     for url in urls: # customize url matching to your taste 
      if url in request.path_info: 
       return http.HttpResponseRedirect(reverse('setUserType')) 

中間件是一個很酷的功能,它很簡單,功能強大。只要不要忘記在settings.MIDDLEWARE_CLASSES註冊。

+0

哇,它的作品非常棒!是否有可能在中間件中使用url_name而不是硬編碼的URL? –

+0

是的,因此評論「#自定義url匹配您的口味」:D – jpic