Verifique a permissão dentro de um modelo no Django

95

Posso usar a verificação de permissão do aplicativo Auth dentro de um template no Django? (Quero exibir um formulário simples no final do modelo para usuários privilegiados)

E o mais importante, devo fazer isso ou esse não é o "jeito do Django"?

Daniel
fonte
Para pessoas como eu, que descobriram isso mais tarde, o link do Django 1.5 foi ligeiramente alterado. As informações agora podem ser encontradas nos documentos neste url: docs.djangoproject.com/en/1.5/topics/auth/default/#permissions Nada na resposta original realmente mudou, mas este é apenas um novo url :)
Xudonax

Respostas:

192

Se você estiver procurando por permissões em modelos, o código a seguir será suficiente:

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

Onde modelo se refere ao modelo para o qual o usuário precisa de permissões para ver o formulário.

Consulte https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions para obter mais exemplos.

As permissões do usuário conectado atualmente são armazenadas na variável de modelo {{ perms }}

(Isto requer o seguinte contexto processador para ser activado: django.contrib.auth.context_processors.auth)

Victor Neo
fonte
15
Observe que, se você estiver logado como superusuário, perms.app_label.foobarsempre será verdadeiro, mesmo se você digitou incorretamente o nome da permissão.
Flimm
2
Observe também que "can_do_something" é o nome da permissão, então você não precisa adicionar um prefixo "can" ao nome da permissão. Por exemplo, perms.my_app.add_object
Karim Sonbol
13

Testado em Django 2.0 +

Se você quiser ver todas as permissões que o usuário conectado tem, em seu modelo (.html), imprima:

{{ perms.app_name }}

Ou

{{ perms }}

Para verificar se o usuário tem permissão, use:

{% if perms.app_name.change_model_name_lower_cased %}

Por exemplo :

{% if perms.Utilization.change_invoice %}

Aqui: Utilização é o nome do meu aplicativo. Fatura é um nome de modelo.

Observe que, em geral, haverá 4 tipos de permissões:

  • alterar [por exemplo, Utilization.change_projectemail]
  • visualizar [por exemplo, Utilization.view_invoice]
  • delete [por exemplo, Utilization.delete_invoicetype]
  • adicionar [Ex: Utilização.add_invoicetype]

Além disso, se você deseja ver todas as permissões que um usuário possui devido aos grupos aos quais ele pertence, inicie o shell do Django ...

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

Aqui, todas as permissões listadas são devidas aos grupos aos quais ele pertence.

Arindam Roychowdhury
fonte
1
Sim. Realmente: em minúsculas. Não snake_cased. A ideia de ver as permissões com {{perms}} é ótima, então acho que esta é a melhor resposta.
mirek