2016-05-23 5 views
0

Ich möchte versuchen, URLs auf meiner Navigationsseite basierend auf der Benutzergruppe anzuzeigen oder auszublenden. zZ addiere ich zum Anfang jeder Ansicht und sende durch einen Wert zur Schablone und das Überprüfen gegen das, aber dieses scheint nicht zu leistungsfähig, auch wenn eine Ansicht nicht auth erfordert und dieser Wert nicht eingestellt wird, bricht das Vorlage?Django - URLs in Basis-HTML anzeigen/verbergen, abhängig von der Benutzergruppe?

Gibt es einen besseren Weg, dies zu tun? Wie ein globales.py, wo ich überprüfen und setzen dann in jeder Vorlage verwenden könnte? oder etwas ganz anderes?

view.py

Authorised_user = '' 
if request.user.is_authenticated(): 
    Authorised_user = 'IT' 

@login_required 
def index(request): 

    return render(request, 'service/index.html', { 
     'Authorised': Authorised_user, 
    })  

template.html

{% if Authorised == 'IT' or Authorised =='Netwworks' %} 
<a href="link">Link</a> 
{% endif %} 
+0

Dies ist ein wenig unklar. Wie bestimmen Sie, ob der Benutzer IT oder Netzwerke ist? Und warum kannst du das nicht in der Vorlage tun? –

+0

Es gibt kein global.py, aber Sie können einen benutzerdefinierten Kontextmanager schreiben, um dies zu erreichen. – Selcuk

+1

Suchen Sie nach TEMPLATE_CONTEXT_PROCESSORS? – Anoop

Antwort

1

i die Benutzergruppen im Admin-django tun haben

Basierend auf Get user group in a template

erstellen user_tags.py/group_tags. py an einem geeigneten Ort. z.B. auth_extra/templatetags/user_tags.py

from django import template 

register = template.Library() 

@register.filter('in_group') 
def in_group(user, group_name): 
    return user.groups.filter(name=group_name).exists() 

Dann in Ihrer Vorlage:

{% load user_tags %} 

{% if request.user|in_group:"IT"%} 
    <a href="link">IT only link</a> 
{% endif %} 

{% if request.user|in_group:"Netwworks"%} 
    <a href="link"> Netwworks only link</a> 
{% endif %} 
0

Sie müssen context_processors.py erstellen und erstellen Sie eine Funktion sagen

def foo(): 
    Authorised_user = '' 
    if request.user.is_authenticated(): 
    Authorised_user = 'IT' 

Dann in setttings TEMPLATE_CONTEXT_PROCESSORS = ("path_to_context_processor.foo") auf diese Weise yo Sie können die foo-Variable in allen Vorlagen verwenden, ohne sie explizit in allen Ansichten zu definieren. Sie können auch einen Blick hier haben: https://rubayeet.wordpress.com/2009/10/31/django-how-to-make-a-variable-available-in-all-templates/