Vérifier l'autorisation dans un modèle dans Django

90

Puis-je utiliser la vérification des autorisations de l'application Auth dans un modèle dans Django? (Je souhaite afficher un formulaire simple à la fin du modèle pour les utilisateurs privilégiés)

Et plus important encore, devrais-je le faire ou est-ce que ce n'est pas la "manière Django"?

Daniel
la source
Pour les gens comme moi, qui tomberont dessus plus tard, le lien pour Django 1.5 a été légèrement modifié. Les informations peuvent maintenant être trouvées dans la documentation à cette url: docs.djangoproject.com/en/1.5/topics/auth/default/#permissions Rien dans la réponse originale n'a vraiment changé, mais ce n'est qu'une nouvelle URL :)
Xudonax

Réponses:

187

Si vous cherchez à vérifier les autorisations dans les modèles, le code suivant suffirait:

{% if perms.app_label.can_do_something %}
<form here>
{% endif %}

Où modèle fait référence au modèle pour lequel l'utilisateur a besoin d'autorisations pour voir le formulaire.

Reportez-vous à https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions pour plus d'exemples.

Les autorisations de l'utilisateur actuellement connecté sont stockées dans la variable de modèle {{ perms }}

(Cela nécessite le processeur de contexte suivant à activer: django.contrib.auth.context_processors.auth)

Victor Neo
la source
14
Notez que si vous êtes connecté en tant que superutilisateur, ce perms.app_label.foobarsera toujours vrai, même si vous avez mal orthographié le nom de l'autorisation.
Flimm
2
Notez également ici que "can_do_something" est le nom de l'autorisation, vous n'avez donc pas besoin d'ajouter un préfixe "can" au nom de l'autorisation. Par exemple, perms.my_app.add_object
Karim Sonbol
11

Testé sur Django 2.0 +

Si vous souhaitez voir toutes les autorisations dont dispose l'utilisateur connecté, sur votre modèle (.html), imprimez:

{{ perms.app_name }}

Ou

{{ perms }}

Afin de vérifier si l'utilisateur a l'autorisation, utilisez:

{% if perms.app_name.change_model_name_lower_cased %}

Par exemple :

{% if perms.Utilization.change_invoice %}

Ici: L' utilisation est le nom de mon application. La facture est un nom de modèle.

Notez qu'en général, il y aura 4 types d'autorisations:

  • modifier [Par exemple, Utilization.change_projectemail]
  • afficher [Par exemple, Utilization.view_invoice]
  • supprimer [Par exemple, Utilization.delete_invoicetype]
  • ajouter [Par exemple, Utilization.add_invoicetype]

De plus, si vous souhaitez voir toutes les autorisations d'un utilisateur en raison des groupes auxquels il appartient, lancez le shell Django ...

user = User.objects.get(username='somename')
user.get_group_permissions()

Ici, toutes les autorisations répertoriées sont dues aux groupes auxquels il appartient.

Arindam Roychowdhury
la source
1
Oui. Vraiment: en minuscules. Pas snake_cased. L'idée de voir les autorisations avec {{perms}} est géniale, donc je pense que c'est la meilleure réponse.
mirek
0

désolé de `` déterrer '' ce post mais j'ai un problème lié aux permissions voir mon post: Django: la logique n'est pas bien appliquée dans le template utilisant les permissions (perm

comme Arindam semble être très à l'aise avec ce concept, j'espère que lui ou un autre pourra m'aider

les perms ne s'appliquent pas même si la valeur est correcte lorsque je recherche {{perms}} dans mon modèle, il renvoie un objet mais pas la liste des autorisations si je recherche {{perms.randomization.can_randomize}} il renvoie False (ou True ) qui est la bonne valeur que mon application s'appelle randomisation et je définis l'autorisation can_randomize dans les modèles de randomisation (en utilisant meta) qui fait partie de mon application de randomisation

Je vérifie settings.py mais toutes les coutures sont ok

COUVREUR
la source
Salut Slater. Je l'ai vu juste aujourd'hui. Il est évidemment trop tard. Mais si vous voulez recommander quelqu'un pour qu'il reçoive le message, ajoutez un @Name avec le message dans cette section de commentaire.
Arindam Roychowdhury