2012-02-23 14 views
1

私は2種類のユーザーがあります。ユーザーがログインすると、ユーザーは/ profileのユーザープロフィールに移動します。ユーザーの種類に応じて異なるプロフィールを表示

ユーザーの種類に基づいて、ユーザーのプロファイルに異なるナビゲーションアイテムとフォームが含まれる場合があります。 {%if%}タグをテンプレートのどこにでも置くのではなく、ユーザータイプに基づいてナビゲーションを構築する簡単な方法がありますか?

答えて

2

なぜ@ dm03514が彼の答えを削除したのか分かりませんが、それは私の考えであったからです。

テンプレートが十分に異なっている場合は、適切であれば、どこにでも分岐するのは悪い考えです。それはちょうどあなたのテンプレートを混乱させる混乱にさせます。そのため、各ユーザータイプごとに個別のテンプレートを作成してください。次に、ユーザーの種類に基づいて表示する1つのテンプレートまたは別のテンプレートを選択できます。

古い形式の関数ベースのビュー:

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の関数にフォントの最後に送信され、振る舞いを変更する

もう1つの選択肢は、プロファイルに基づいて異なるページにユーザーを誘導することです。この問題は、さまざまなユーザーに異なるURLが必要になるという難点があります。これは、コードの重複の多くにつながる可能性があります。

+0

「{admin_menu.htm '{%endif%}」を使用して、ユーザーの種類に基づいてプロファイルをモジュール化してモジュール化することができます。 admin_menu.htmは、管理者のためのメニューオプションでいっぱいの単純な '

'である可能性があります。 – Furbeenator

1

権限を使用することについて考えましたか? 私はカスタムパーミッションと同じです。簡単な部分は、authが必要なものをすべて提供していることです。

クリス・プラットが使用される提案するものと非常に類似したコード:

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あなたがテンプレートの一部を変更する必要がある場合は、ユーザーの可能性

を制限する必要がある場合は、異なるからそれらの部品をロードするために、{%は%を含ま}してみてくださいファイル。

関連する問題