2012-02-23 33 views
1

我有兩種類型的用戶。用戶登錄後,我將用戶帶到他/她的用戶個人資料根據用戶類型顯示不同的配置文件

根據用戶類型,他們的個人資料可能包含不同的導航項目和表單。有沒有更簡單的方法來構建基於用戶類型的導航,而不是將模板中的{%if%}標籤放在任何位置。

回答

2

不知道爲什麼@ dm03514刪除了他的答案,但我會發布類似的東西,因爲這也是我的想法。

如果模板足夠不同,那麼你是對的,分支到處都是一個壞主意。它只會讓你的模板變得混亂。所以只需爲每個用戶類型創建一個單獨的模板。然後,在您看來,您可以選擇一個或另一個模板來根據用戶類型進行顯示。例如:

舊式的基於函數的觀點:

def profile_view(request): 
    if request.user.get_profile().type == 'foo': 
     template = 'path/to/foo_profile.html' 
    elif request.user.get_profile().type == 'bar': 
     template = 'path/to/bar_profile.html' 
    else: 
     template = 'path/to/generic_profile.html' # if you want a default 

    return render_to_response(template, {'data': 'data'}, context_instance=RequestContext(request)) 

新式基於類的觀點:

class MyView(View): 
    def get_template_names(self): 
     if self.request.user.get_profile().type == 'foo': 
      return ['path/to/foo_profile.html'] 
     elif self.request.user.get_profile().type == 'bar': 
      return ['path/to/bar_profile.html'] 
     else: 
      return ['path/to/generic_profile.html'] 

我不知道如何您的用戶類型但如果它基於字符串值,則甚至可以創建更加自動化的內容,例如:

template = 'path/to/%s_profile.html' % request.user.get_profile().type 

然後,只需根據該命名方案爲每種類型創建一個模板。

而且,當然,每個模板都可以擴展基本profile.html模板,從而可以將一些常用功能分解出來。

1

創建一個配置文件模型並將用戶鏈接到此配置文件模型。 (通過外鍵)

配置文件模型將爲不同的行爲具有不同的屬性。

這些不同的行爲將通過分支模板(如您在模板中使用的話所示)或將不同的數據返回到模板或發送到字體端的javascript函數以修改行爲

另一種選擇是將用戶引導到基於配置文件的不同頁面。這個挑戰是不同的用戶需要不同的URL。這可能會導致大量的代碼重複。

+0

你可以建立個人資料一頁和模塊化的部件,包含/排除他們基於使用'用戶類型{%如果admin_type%}包括「admin_menu.htm」 {%ENDIF%}'。 admin_menu.htm可以是一個簡單的'

'完整的管理員菜單選項。 – Furbeenator 2012-02-23 21:31:50

1

你有沒有想過使用權限? 我的自定義權限也一樣。容易的部分是認證提供你需要的任何東西,並且它始終在請求中。

非常類似的代碼是什麼克里斯·帕拉特提出將用於:

def profile_view(request): 
    if request.user.has_perm('permission_codename_foo'): 
     template = 'path/to/foo_profile.html' 
    elif request.user.has_perm('permission_codename_bar'): 
     template = 'path/to/bar_profile.html' 
    else: 
     template = 'path/to/generic_profile.html' # if you want a default 

    return render_to_response(template, {'data': 'data'}, context_instance=RequestContext(request)) 

什麼是有用的,是你可以使用相同的權限與裝飾保護您的觀點:

@permission_required('permission_codename_foo') 
def foo(): 
    #your view here 

,或者如果你想檢查權限備選方案:

#user_passes_test(lambda u: u.has_perm('permission_codename_foo') or u.has_perm('permission_codename_bar')) 
def foo_or_bar(): 
    #your view here 

django創建整個一堆默認權限以及命名爲:app_name.add_modelname,app_name.change_modelname和app_name.delete_modelname如果你需要的,如果您需要更改的模板部分,嘗試{%包含%}加載不同的部分來限制用戶的可能性

文件。

相關問題