Verifique el permiso dentro de una plantilla en Django

90

¿Puedo usar la verificación de permisos de la aplicación Auth dentro de una plantilla en Django? (Quiero mostrar un formulario simple al final de la plantilla para usuarios privilegiados)

Y lo que es más importante, ¿debería hacerlo en absoluto o no es el "estilo Django"?

Daniel
fuente
Para personas como yo, que se topan con esto más tarde, el enlace de Django 1.5 se modificó ligeramente. La información ahora se puede encontrar en los documentos en esta url: docs.djangoproject.com/en/1.5/topics/auth/default/#permissions Nada en la respuesta original realmente cambió, pero esta es solo una nueva URL :)
Xudonax

Respuestas:

187

Si está buscando verificar los permisos en las plantillas, el siguiente código sería suficiente:

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

Donde modelo se refiere al modelo para el que el usuario necesita permisos para ver el formulario.

Consulte https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions para obtener más ejemplos.

Los permisos del usuario actualmente conectado se almacenan en la variable de plantilla {{ perms }}

(Esto requiere el siguiente procesador de contexto para estar habilitado: django.contrib.auth.context_processors.auth)

Víctor Neo
fuente
14
Tenga en cuenta que si ha iniciado sesión como superusuario, perms.app_label.foobarsiempre será verdadero, incluso si escribió mal el nombre del permiso.
Flimm
2
También tenga en cuenta aquí que "can_do_something" es el nombre del permiso, por lo que no necesita agregar un prefijo "can" al nombre del permiso. Por ejemplo, perms.my_app.add_object
Karim Sonbol
11

Probado en Django 2.0 +

Si desea ver todos los permisos que tiene el usuario que inició sesión, en su plantilla (.html), imprima:

{{ perms.app_name }}

O

{{ perms }}

Para verificar si el usuario tiene permiso, use:

{% if perms.app_name.change_model_name_lower_cased %}

P.ej :

{% if perms.Utilization.change_invoice %}

Aquí: Utilization es el nombre de mi aplicación. Factura es un nombre de modelo.

Tenga en cuenta que, en general, habrá 4 tipos de permisos:

  • cambiar [Ej. Utilization.change_projectemail]
  • ver [Por ejemplo, Utilization.view_invoice]
  • eliminar [Ej. Utilization.delete_invoicetype]
  • añadir [Ej. Utilization.add_invoicetype]

Además, si desea ver todos los permisos que tiene un usuario debido a los grupos a los que pertenece, ejecute el shell de Django ...

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

Aquí, todos los permisos enumerados se deben a los grupos a los que pertenece.

Arindam Roychowdhury
fuente
1
Si. Realmente: minúsculas. No en caja de serpiente. La idea de ver permisos con {{perms}} es genial, así que creo que esta es la mejor respuesta.
mirek
0

lamento 'desenterrar' esta publicación, pero tengo un problema relacionado con los permisos, vea mi publicación: Django: la lógica no se aplica bien en la plantilla con permisos (perm

Como Arindam parece estar muy cómodo con este concepto, espero que él u otro puedan ayudarme.

los permisos no se aplican incluso si el valor es correcto cuando busco {{perms}} en mi plantilla devuelve un objeto pero no la lista de permisos si busco {{perms.randomization.can_randomize}} devuelve False (o True ) ese es el buen valor que mi aplicación se llama aleatorización y defino el permiso can_randomize en los modelos de aleatorización (usando meta) que es parte de mi aplicación de aleatorización

Reviso settings.py pero todas las costuras están bien

PIZARRERO
fuente
Hola Slater. Vi esto hoy mismo. Obviamente es demasiado tarde. Pero si desea recomendar a alguien para que reciba el mensaje, agregue un @Name con el mensaje en esta sección de comentarios.
Arindam Roychowdhury