2011-01-02 17 views
10

今は私のサイトにユーザーとビジネスの2つの異なるユーザーグループがあります。ユーザーグループに基づいてDjangoテンプレートを変更するにはどうすればよいですか?

今は、両方のユーザーグループが自分のプロフィールページを見ることができるように1つのログインのみを使用しています。

しかし、プロフィールページには私が欲しいと思う部分と、ビジネスだけに見せたい部分があります。どのように各グループがこのページで見るものを制限することができますか?

何らかのif文を使ってテンプレートで行うべきですか?誰かが私に知らせることができる他の解決策がありますか?

+0

あなたは[権限]を使用しないでください(https://docs.djangoproject.com/en:テンプレート自体で次に

from django import template from django.contrib.auth.models import Group register = template.Library() @register.filter(name='has_group') def has_group(user, group_name): try: group = Group.objects.get(name=group_name) except: return False # group doesn't exist, so for sure the user isn't part of the group # for superuser or staff, always return True if user.is_superuser or user.is_staff: return True return user.groups.filter(name=group_name).exists() 

/dev/ref/models/options /#permissions)メカニズムを使用していますか? –

答えて

10

これはおそらくもう気にするには古すぎるかもしれませんが、私は自分でそれを見つけ出す前に自分自身を見つけました。それはでそのif句事実に依存
{% if is_customer %} customer stuff here {% endif %}

:あなたのテンプレートで

is_customer = request.user.groups.filter(name='Customers').exists() 

:このような何かを追加し、あなたのビューで

:後世のために、私は、次の解決策を見つけましたテンプレートは空のリストに対してfalseと評価されます。私はこの問題を解決するためにやった

+2

'.exists()'を 'filter()'呼び出しの最後に追加して、 'is_customer'の実際のブール値を取得することができます。 – CoreDumpError

12

は次のとおりです。

  1. 私は基本的に、あなたのテンプレートで使用するための新しい変数を挿入するカスタムコンテキストプロセッサを作成し、自分の設定にこれを追加しました。 https://docs.djangoproject.com/en/1.3/ref/templates/api/#django.template.RequestContext @詳細を参照してください。

    TEMPLATE_CONTEXT_PROCESSORS = (
        'django.core.context_processors.debug', 
        'django.core.context_processors.i18n', 
        'django.core.context_processors.media', 
        'django.core.context_processors.static', 
        'django.contrib.auth.context_processors.auth', 
        'django.contrib.messages.context_processors.messages', 
        'common.user_context.user_context' 
    ) 
    
  2. 私はファイルuser_context内の機能user_contextを書くようになった、鉱山はそうのようなものです:

    def user_context(request): 
        if request.user.is_authenticated(): 
         is_admin = is_local_admin(request.user) 
        else: 
         is_admin = False 
    
        return { 
         'is_local_admin': is_admin 
        } 
    

    is_local_adminは、ユーザーが属するかどうかをチェックするだけの機能です管理者グループかどうか。

    return render_to_response('create_user.html', { 
        'form': form 
    }, context_instance=RequestContext(request)) 
    

重要な部分は、カスタムコンテキストプロセッサをロードRequestContext、次のとおりです。私は例えば、私は私の見解で、それをレンダリングするためにこれを使用して、私のテンプレートでは、このis_local_admin情報が必要なときはいつでも

  • 私たちはあなただけ使用することができ、あなたのテンプレートで今すぐステップ1で

    を構築:

    {% if is_local_admin %} 
        <h1>You can see this</h1> 
    {% else %} 
        <h1>Nothing here</h1> 
    {% endif %} 
    

    これは誰かを助けることを願っています。要約すると:カスタムコンテキストプロセッサを見て、彼らは読んで価値があります。

  • 13

    ことがthis Google Groups postで提案のように、あなたはテンプレートスニペットを使用することができ、あなたのビュー関数には何も追加しないようにしたい、とあなたは@thyagx’s answerごとに認証コンテキストプロセッサ(django.contrib.auth.context_processors.auth)とRequestContextを使用している場合:

    {% for group in user.groups.all %} 
        {% if group.name == 'customers' %} 
         {% comment %}Customer-specific code goes here{% endcomment %} 
        {% endif %} 
    {% endfor %} 
    

    少し冗長ですが、(RequestContextの使用を除いて)あなたのビューで何もする必要はなく、カスタムコンテキストプロセッサを作成することを意味します。

    7

    テンプレートタグを使用して、これを私が見つけたものに基づいて実装しました。here おそらく、それは誰かにとって役に立ちます。 utilsので

    /utils_extras.py:

    {% load utils_extras %} 
    {% if user|has_group:"mygroup" %} 
    
    +0

    別のオプション:http://stackoverflow.com/a/1052667/573034 – Paolo

    関連する問題