私は2種類のユーザーがあります。ユーザーがログインすると、ユーザーは/ profileのユーザープロフィールに移動します。ユーザーの種類に応じて異なるプロフィールを表示
ユーザーの種類に基づいて、ユーザーのプロファイルに異なるナビゲーションアイテムとフォームが含まれる場合があります。 {%if%}タグをテンプレートのどこにでも置くのではなく、ユーザータイプに基づいてナビゲーションを構築する簡単な方法がありますか?
私は2種類のユーザーがあります。ユーザーがログインすると、ユーザーは/ profileのユーザープロフィールに移動します。ユーザーの種類に応じて異なるプロフィールを表示
ユーザーの種類に基づいて、ユーザーのプロファイルに異なるナビゲーションアイテムとフォームが含まれる場合があります。 {%if%}タグをテンプレートのどこにでも置くのではなく、ユーザータイプに基づいてナビゲーションを構築する簡単な方法がありますか?
なぜ@ 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テンプレートを拡張することができ、いくつかの共通の機能を除外できます。
プロファイルモデルを作成し、このプロファイルモデルにリンクします。 (外部キーを介して)
プロファイルモデルは、さまざまな動作に対して異なる属性を持ちます。
これらの異なる振る舞いは、テンプレートを分岐したり(テンプレート内にあると言うように)、テンプレートに別のデータを返すか、またはJavaScriptの関数にフォントの最後に送信され、振る舞いを変更する
もう1つの選択肢は、プロファイルに基づいて異なるページにユーザーを誘導することです。この問題は、さまざまなユーザーに異なるURLが必要になるという難点があります。これは、コードの重複の多くにつながる可能性があります。
権限を使用することについて考えましたか? 私はカスタムパーミッションと同じです。簡単な部分は、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あなたがテンプレートの一部を変更する必要がある場合は、ユーザーの可能性
を制限する必要がある場合は、異なるからそれらの部品をロードするために、{%は%を含ま}してみてくださいファイル。
「{admin_menu.htm '{%endif%}」を使用して、ユーザーの種類に基づいてプロファイルをモジュール化してモジュール化することができます。 admin_menu.htmは、管理者のためのメニューオプションでいっぱいの単純な '
'である可能性があります。 – Furbeenator