Перевірте дозвіл усередині шаблону в Django


90

Чи можу я використовувати перевірку дозволу програми Auth у шаблоні в Django? (Я хочу відобразити просту форму в кінці шаблону для привілейованих користувачів)

І що важливіше, чи варто це робити взагалі, чи це не «шлях Джанго»?


Для таких людей, як я, які натрапляють на це пізніше, посилання для Django 1.5 було трохи змінено. Інформацію тепер можна знайти в документах за цією URL-адресою: docs.djangoproject.com/en/1.5/topics/auth/default/#permissions Нічого в оригінальній відповіді насправді не змінилося, але це просто нова URL-адреса :)
Xudonax

Відповіді:


187

Якщо ви хочете перевірити наявність дозволів у шаблонах, буде достатньо такого коду:

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

Де модель відноситься до моделі, для якої користувачеві потрібні дозволи для перегляду форми.

Щоб отримати додаткові приклади, зверніться до https://docs.djangoproject.com/en/stable/topics/auth/default/#permissions .

Поточні дозволи користувача, що зареєстровані, зберігаються у змінній шаблону {{ perms }}

( Для цього потрібно наступний контекст процесора повинен бути включений: django.contrib.auth.context_processors.auth)


14
Зверніть увагу, що якщо ви ввійшли як суперкористувач, perms.app_label.foobarце завжди буде істиною, навіть якщо ви неправильно написали ім'я дозволу.
Флімм

2
Тут також зверніть увагу, що "can_do_something" - це ім'я дозволу, тому вам не потрібно додавати префікс "can" до імені дозволу. Наприклад, perms.my_app.add_object
Карім Сонбол

11

Перевірено на Django 2.0 +

Якщо ви хочете побачити всі дозволи, які має зареєстрований користувач, у вашому шаблоні (.html) роздрукуйте:

{{ perms.app_name }}

Або

{{ perms }}

Щоб перевірити, чи має користувач дозвіл, використовуйте:

{% if perms.app_name.change_model_name_lower_cased %}

Наприклад:

{% if perms.Utilization.change_invoice %}

Тут: Використання - це моє ім’я програми. Рахунок - це назва моделі.

Зверніть увагу, що загалом буде 4 типи дозволів:

  • змінити [Напр. Utilization.change_projectemail]
  • переглянути [Напр. Utilization.view_invoice]
  • видалити [Напр. Utilization.delete_invoicetype]
  • додати [Напр. Utilization.add_invoicetype]

Крім того, якщо ви хочете побачити всі дозволи, які користувач має завдяки групам, до яких він належить, запустіть оболонку Django ...

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

Тут усі перелічені дозволи обумовлені групами, до яких він належить.


1
Так. Дійсно: нижній регістр. Не в змії. Ідея побачити дозволи з {{perms}} чудова, тому я думаю, що це найкраща відповідь.
mirek


0

вибачте, що "розкопали" цю публікацію, але у мене проблема, пов'язана з дозволами, див. мій пост: Django: логіка погано застосована в шаблоні з використанням дозволів (perm

оскільки Аріндам, здається, дуже відповідає цій концепції, сподіваюся, він чи хтось інший може мені допомогти

завивки не застосовуються, навіть якщо значення правильне, коли я шукаю в моєму шаблоні {{perms}}, він повертає об’єкт, але не список дозволів, якщо шукаю {{perms.randomization.can_randomize}}, повертає False (або True ), що є хорошим значенням, що мій додаток називається рандомізацією, і я визначаю дозвіл can_randomize у моделях рандомізації (з використанням мета), який є частиною мого додатку для рандомізації

Я перевіряю settings.py, але з усіма швами все в порядку


Привіт, Слейтере. Я бачив це буквально сьогодні. Очевидно, пізно. Але якщо ви хочете передати когось, щоб він отримав повідомлення, додайте @Name із повідомленням у цьому розділі коментарів.
Arindam Roychowdhury
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.