Проверить разрешение внутри шаблона в Django


90

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

И что еще более важно, должен ли я вообще это делать или это не «способ 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всегда будет true, даже если вы неправильно написали имя разрешения.
Flimm

2
Также обратите внимание, что «can_do_something» - это имя разрешения, поэтому вам не нужно добавлять префикс «может» к имени разрешения. Например, 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}} прекрасна, поэтому я думаю, что это лучший ответ.
Мирек


0

извините, что «раскопал» этот пост, но у меня проблема, связанная с разрешениями, см. мой пост: Django: логика не очень хорошо применяется в шаблоне с использованием разрешений (perm

поскольку швы Ариндама очень удобны с этой концепцией, я надеюсь, что он или другой может мне помочь

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

Проверяю settings.py, но все швы в порядке


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