2017-10-20 3 views
0

J'ai construit un processus contextuel qui envoie les autorisations aux utilisateurs connectés en tant que chaîne dans un modèle. Puis, en fonction des utilisateurs perms, j'affiche ou cache les urls.Django - requête de processus contextuel répétée 102 fois

Cependant, l'utilisation de la barre d'outils de débogage ive juste vu que la requête est exécutée 102 fois pour une raison que je ne sais pas

Le débogage (les changements d'identité et il semble que il y a trois de chaque ID dans les doublons)

SELECT `django_content_type`.`id`, `django_content_type`.`app_label`, `django_content_type`.`model` FROM `django_content_type` WHERE `django_content_type`.`id` = 35 
    Duplicated 102 times. 
0.6862959744274587% 
23.41 
Sel Expl 
Connection: default 
/itapp/itapp/sites/views.py in site_detail_files(214) 
    'PageType' : 'files', 
/usr/local/lib/python3.6/contextlib.py in __enter__(81) 
    return next(self.gen) 
/itapp/itapp/itapp/context_processors.py in UserPerms(34) 
    'Perms': str(all_perms), 

la fonction:

def UserPerms(request): 
    from django.contrib.auth.models import Permission 
    all_perms = [] 
    if str(request.user) != 'AnonymousUser': 
     permissions = Permission.objects.filter(user=request.user) 
     group_permissions = Permission.objects.filter(group__user=request.user) 

     all_perms = [] 
     for p in permissions: 
      all_perms.append(p) 
     for p in group_permissions: 
      all_perms.append(p) 
    return { 
     'Perms': str(all_perms), 
    } 

ajouté aux modèles dans settings.py

TEMPLATES = [ 
    { 
     'BACKEND': 'django.template.backends.django.DjangoTemplates', 
     'DIRS': [ 
      BASE_DIR + '/templates/', 
      ], 
     'APP_DIRS': True, 
     'OPTIONS': { 
      'debug' : DEBUG, 
      'context_processors': [ 
       'django.template.context_processors.debug', 
       'django.contrib.auth.context_processors.auth', 
       'django.contrib.messages.context_processors.messages', 
       'django.template.context_processors.media', 
       'django.template.context_processors.static', 
       'itapp.context_processors.breadcrumb_history', 
       'itapp.context_processors.UserPerms', 
      ], 
     }, 
    }, 
] 

Exemple d'utilisation:

<li><a href="{% url 'sites:site_detail_circuits' SiteID %}">Circuits</a> 
{% if "Permission: sites | Circuit Data | Can add Circuit Data" in Perms %}  
    {% if PageType == 'circuits' %} 
    <ul> 
     <li><a href="{% url 'admin:sites_circuits_add' %}?site_data={{ SiteID }}">Add new circuit</a></li> 

    </ul> 
    {% endif %} 
{% endif %} 
</li> 

Répondre

1

Django provides a way to check permissions in the template. Vous n'avez pas besoin de créer une chaîne contenant les autorisations.

{% if perms.sites.add_circuit_data %} 
{% if PageType == 'circuits' %} 
<ul> 
    <li><a href="{% url 'admin:sites.add_circuit' %}?site_data={{ SiteID }}">Add new circuit</a></li> 

</ul> 
{% endif %} 

Vous avez besoin du processeur de contexte auth activé pour que cela fonctionne, mais puisque c'est dans le fichier par défaut des paramètres générés vous ne devriez pas avoir à changer quoi que ce soit.

+0

qui a fonctionné, merci! – AlexW

+0

est-il également possible de vérifier les groupes de cette façon? Je ne peux pas le voir sur la page référencée – AlexW

+0

'{% si perms.app.perm_name%}' fonctionne de la même façon que ['user.has_perm'] (https://docs.djangoproject.com/fr/1.11/ref/ contrib/auth/# django.contrib.auth.models.User.has_perm) dans la vue - il renvoie 'True' si l'utilisateur est dans un groupe qui a cette permission. Il gère également le super-utilisateur et les indicateurs actifs de manière appropriée. – Alasdair