Использование доступа в Django используя is_staff is_superuser
Всем привет не могу разобраться. Хочу запретить во view в частности CreateView создавать записи пользователям, если у него не стоят галочки is_staff или is_superuser. Подскажите как это правильно сделать? Использую классы generic.
Отслеживать
задан 2 июн 2023 в 10:02
37 2 2 бронзовых знака
Используйте PermissionRequiredMixin
3 июн 2023 в 8:52
PermissionRequiredMixin мне не подходит. У меня выше конкретный вопрос с помощью is_staff is_superuser как это сделать.
8 июн 2023 в 12:25
Тогда делать проверку: if not request.user.is_staff
10 июн 2023 в 8:09
Вот именно. А в каком методе делать проверку? Эта проверка нужна мне до создания пустой формы, чтоб если галки is_staff не было форма не отобразилась и была переадресация на главную. С помощью класса View я знаю как это сделать, а вот с помощью CreateView не знаю.
10 июн 2023 в 10:21
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Тема закрыта всем спасибо!
Классы generic наследуются от BaseUpdateView в котором есть как и в классе View методы get и post то есть их можно переопределить.
class UserViewList(LoginRequiredMixin, ListView): template_name = 'userlist.html' model = CustomUser paginate_by = 15 context_object_name = 'users' def get(self, request, *args, **kwargs): if self.request.user.is_staff: self.object = None return super().get(request, *args, **kwargs) else: return redirect('home') def post(self, request, *args, **kwargs): if self.request.user.is_staff: self.object = None return super().post(request, *args, **kwargs) else: return redirect('home') def get_queryset(self, **kwargs): queryset = CustomUser.objects.all() return queryset
Руководство Django часть 4: административная панель Django
Теперь, когда модели для сайта местной библиотеки созданы, добавим некоторые «настоящие» данные о книгах, используя административную панель Django Admin. Для начала мы покажем, как зарегистрировать в ней модели, потом как войти и создать какие-нибудь данные. В конце статьи мы покажем некоторые способы дальнейшего улучшения вида админ-панели.
| Предусловия: | Сначала завершите: Руководство часть 3: использование моделей. |
|---|---|
| Цель: | Уяснить преимущества и ограничения админ-панели Django, научиться использовать её для создания записей для наших моделей. |
Обзор
Приложение Django admin может использовать ваши модели для автоматического создания части сайта, предназначенной для создания, просмотра, обновления и удаления записей. Это может сэкономить вам много времени в процессе разработки, упрощая тестирование ваших моделей на предмет правильности данных. Оно также может быть полезным для управления данными на стадии публикации, в зависимости от типа веб-сайта. Проект Django рекомендует это приложение только для управления внутренними данными (т.е.для использования администраторами, либо людьми внутри вашей организации), так как модельно-ориентированный подход не обязательно является наилучшим интерфейсом для всех пользователей и раскрывает много лишних подробностей о моделях.
Все необходимые настройки, которые необходимо включить в admin приложение вашего веб-сайта, были сделаны автоматически, когда вы создали каркас проекта ( информацию о необходимых актуальных зависимостях смотрите здесь — Django docs) . В результате все, что необходимо сделать для того, чтобы добавить модели в приложение admin, это зарегистрировать их. В конце этой статьи мы представим краткую демонстрацию того, каким образом можно дополнительно настроить админ-панель для лучшего отображения данные наших моделей.
После регистрации моделей мы покажем как создать нового суперпользователя , войти на сайт от его имени и создать книги, авторов, экземпляры книг и жанры. Это будет полезным для тестирования представлений и шаблонов, которые мы начнём создавать в следующей части руководства.
Регистрация моделей
Вначале откройте файл admin.py в папке приложения (/locallibrary/catalog/admin.py). Пока он выглядит так (заметьте, что он уже содержит импорт django.contrib.admin) :
from django.contrib import admin # Register your models here.
Зарегистрируйте модели путём вставки следующего текста в нижнюю часть этого файла. Этот код просто импортирует модели и затем вызывает admin.site.register для регистрации каждой из них.
from .models import Author, Genre, Book, BookInstance admin.site.register(Book) admin.site.register(Author) admin.site.register(Genre) admin.site.register(BookInstance)
Примечание: Если вы приняли участие в создании модели для представления естественного языка книги (см. обучающую статью о моделях), импортируйте и зарегистрируйте её тоже!
Это самый простой способ регистрации модели или моделей. Админ-панель имеет множество настроек. Мы рассмотрим другие способы регистрации ваших моделей ниже.
Создание суперпользователя
Для того, чтобы войти в админ-панель, нам необходимо иметь учётную запись пользователя со статусом Staff (сотрудники). Для просмотра и создания записей, пользователю также понадобится разрешение для управления всеми нашими объектами. Вы можете создать учётную запись «superuser», которая даёт полный доступ к сайту и все необходимые разрешения, используя manage.py.
Для создания суперпользователя вызовите следующую команду из той же папки, где расположен manage.py. Вас попросят ввести имя пользователя, адрес электронной почты и надёжный пароль.
bashВход в админ-панель и её использование
Для входа в админ-панель откройте ссылку /admin (например http://127.0.0.1:8000/admin) и введите логин и пароль вашего нового суперпользователя (вас перенаправят на login-страницу и потом обратно на /admin после ввода всех деталей).
В этой части сайта отображаются все наши модели, сгруппированные по установленному приложению. Вы можете кликнуть на названии модели, чтобы получить список всех связанных записей, далее можете кликнуть на этих записях, для их редактирования . Также можно непосредственно кликнуть на ссылку Add, расположенную рядом с каждой моделью, чтобы начать создание записи этого типа.
Кликните на ссылке Add справа от Books, чтобы создать новую книгу (появится диалоговое окно как на картинке внизу). Заметьте, что заголовок каждого поля - это тип используемого виджета, и
help_text(если есть) совпадает со значением, которое вы указали в модели.Введите значение для полей. Вы можете создавать новых авторов или жанры, нажимая на значок "+ ", расположенный рядом с соответствующим полем (или выберите существующее значение из списков, если вы уже создали их). Когда вы закончили, нажмите на SAVE,Save and add another, или Save and continue editing, чтобы сохранить записи.
Примечание: А сейчас, хотелось бы, чтобы вы добавили несколько книг, авторов и жанров (например, Фэнтези) в ваше приложение. Удостоверьтесь, что каждый автор и жанр включает пару различных книг (позже, когда мы реализуем представления "list" и "detail", это сделает их более интересными).
После того, когда книги добавлены, для перехода на главную страницу админ-панели кликните на ссылке Home в верхней части страницы. Потом кликните на ссылке Books для отображения текущего списка книг (или на одной из других ссылок, чтобы увидеть список соответствующей модели). После добавления нескольких книг список может выглядеть наподобие скриншота ниже. Отображается название каждой из книг. Его возвращает метод
__str__()в модели Book, созданной в предыдущей статье.
Для удаления книги из этого списка выберите чекбокс рядом с ней и действие delete. из выпадающего списка Action, а затем нажмите кнопку Go. Также можно добавить новую книгу, нажав на кнопку ADD BOOK.
Вы можете редактировать книгу, кликнув по ссылке с её названием. Страница редактирования книги, приведённая ниже, практически идентична странице добавления новой книги. Основные отличия - это заголовок страницы (Change book) и наличие кнопок Delete, HISTORY и VIEW ON SITE. Последняя присутствует, так как мы определили метод
get_absolute_url()в нашей модели.
Теперь перейдите назад на страницу Home (используя ссылку Home в навигационной цепочке вверху страницы) и просмотрите списки Author и Genre. В них уже должно быть несколько элементов, созданных при добавлении новых книг. Если хотите, добавьте ещё.
Однако у вас не будет ни одного экземпляра книги, потому что они не создаются из модели
Book(хотя можно создать книгу из моделиBookInstance— такова природа поляForeignKey). Для отображения страницы Add book instance (см. рисунок ниже) вернитесь на страницу Home и нажмите кнопку Add. Обратите внимание на длинный уникальный Id для идентификации конкретного экземпляра книги в библиотеке.
Создайте несколько экземпляров для каждой из ваших книг. Установите статус Available (доступен) для некоторых экземпляров и On loan (выдан) для остальных. Если статус экземпляра notAvailable (недоступен), то также установите дату возврата (Due back).
Вот и все! Вы изучили как запустить и использовать админ-панель. Также были созданы записи для
Book,BookInstance,GenreиAuthor, которые можно будет использовать после создания наших собственных представлений и шаблонов."Продвинутая" конфигурация
Django выполняет неплохую работу по созданию базовой админ-панели используя информацию из зарегистрированных моделей:
- каждая модель имеет список записей, каждая из которых идентифицируется строкой, создаваемой методом
__str__()модели, и связана с представлением для её редактирования. По умолчанию, в верхней части этого представления находится меню действий, которое может быть использовано для удаления нескольких записей за раз- Формы для редактирования и добавления записей содержат все поля модели, которые расположены вертикально в порядке их объявления в модели.
Можно настроить интерфейс пользователя для упрощения его использования. Некоторые доступные настройки:
- List views:
- добавление дополнительных отображаемых полей или информации для каждой записи.
- добавление фильтров для отбора записей по разным критериям (например, статус выдачи книги).
- добавление дополнительных вариантов выбора в меню действий и места расположения этого меню на форме.
- Detail views
- выбор отображаемых полей, их порядка, группирования и т.д.
- добавление связанных полей к записи (например, возможности добавления и редактирования записей книг при создании записи автора).
В этом разделе рассмотрим некоторые изменения для совершенствования интерфейса пользователя нашей местной библиотеки, а именно: добавление дополнительной информации в списки моделей
BookиAuthor, а также улучшение расположения элементов соответствующих представлений редактирования. Пользовательский интерфейс моделейLanguageandGenreизменять не будем, так как это не даст заметного улучшения, поскольку он содержит только по одному полю!Полное руководство по всем возможным вариантам настройки админ-панели можно найти в The Django Admin site (документация Django).
Регистрация класса ModelAdmin
Для изменения отображения модели в пользовательском интерфейсе админ-панели, необходимо определить класс ModelAdmin (он описывает расположение элементов интерфейса, где Model - наименование модели) и зарегистрировать его для использования с этой моделью.
Давайте начнём с модели Author. Откройте файл admin.py в каталоге приложения (/locallibrary/catalog/admin.py). Закомментируйте исходную регистрацию (используя префикс #) этой модели:
js.site.register(Author)Теперь добавьте новый класс AuthorAdmin и зарегистрируйте его как показано ниже:
# Define the admin class class AuthorAdmin(admin.ModelAdmin): pass # Register the admin class with the associated model admin.site.register(Author, AuthorAdmin)Сейчас мы добавим классы ModelAdmin для моделей Book , и BookInstance . Нам снова нужно закомментировать исходную регистрацию:
.site.register(Book) #admin.site.register(BookInstance)Как в Django определять админа, персонал, какую-то роль (которую определили в админке), как назначать свежезареганному пользователю роль?
Сразу прошу не ругаться и не кидать ссылки на https://docs.djangoproject.com/en/2.1/ref/contrib/auth/, ибо там не даются примеры простых действий, которые мне нужны и я не могу понять, что сделать чтобы получить результат.
- admin - он же суперпользователь
- personal - просто зарегистрированный пользователь с поставленной галочкой в админке напротив персонала.
- manager - поставлена галочка персонала и добавлена роль manage (в которой разрешения на проверку заказов)
- first, second, test, test2 . - толпа пользователей, которым никакие права и роли не назначены (ибо я не знаю как это делать), но которые зарегистрированы не в админке, а в интернет-магазине при оформлении заказов и каждый из них может логиниться и каждый может заходить в свой ЛК
Да и вообще все перечисленные выше пользователи могут логиниться, оформлять заказы и заходить в свой ЛК.
Изначально планировалось создать серию админок-кабинетов под каждую роль. Но я с этим не могу разобраться уже неделю. Казалось бы простая вещь, но нигде в документации Django и в примерах на ютубе, даже англоязычном, я не могу найти простую вещь. (да, английский я не знаю и пользуюсь лишь гугл-переводчиком).
Что собственно мне нужно? А нужно в фале views.py простую вещь:
# если авторизован, то if request.user.is_authenticated: if это_суперпользователь: # загружаем админку-кабинет суперпользователя (тот который я сам сделал) # . elif это_персонал без ролей: # загружаем админку-кабинет персонала (другой, но тот который я сам сделал) без каких-либо спец.разрешений # . elif это_персонал с ролью manage: # загружаем админку-кабинет менеджера (другой, но тот который я сам сделал) # . else: # загружаем админку-кабинет простых пользователей (другой, но тот который я сам сделал) # . кстати это (надеюсь просто через подготовку данных и # return HttpResponseRedirect(reverse('account')) # и объяснять мне не надо. Мне нужны именно что писать в If-ах?Ну почему вот в такой простой доступной и понятной форме нельзя это написать в документации? Ребята ну помогите пожалуйста. Устал уже читать и смотреть кучу несвязанных отрывков.
И если не сложно, скажите что добавить в registration_view, чтобы назначить свежерегистрирующемуся определённую роль. Сейчас там так:
def registration_view(request): form = RegistrationForm(request.POST or None) if form.is_valid(): new_user = form.save(commit=False) new_user.username = form.cleaned_data['username'] new_user.set_password(form.cleaned_data['password']) new_user.email = form.cleaned_data['email'] new_user.first_name = form.cleaned_data['first_name'] new_user.last_name = form.cleaned_data['last_name'] new_user.save() login_user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password']) if login_user: login(request, login_user) return HttpResponseRedirect(reverse('account')) context = < 'form': form, >return render(request, 'registration.html', context)
- Вопрос задан более трёх лет назад
- 9740 просмотров
1 комментарий
Простой 1 комментарий
Максим Зубенко @JawsIk Автор вопроса
Pavel Denisov, спасибо за ответ.
1. ну это как бы моя собственная форма регистрации (не та, которая по умолчанию), а т.к. я учусь по урокам, то там лектор строго настрого сказал, что брать данные нужно из cleaned_data, т.к. там уже почищенные данные, которые способны избежать XSS-инъекций. Я XSS баловался ещё лет 15 назад, когда от нефиг делать мы убивали asp буржуйские сайты (я тогда вообще не знал что это такое, просто мог скопипастить запрос и чувствовать себя великим хацкером), поэтому я решил, чтобы подобного не случилось с Django, я буду использовать всё как учат.
2. Видимо я не правильно выразился. Под словом Роли я имел ввиду группы. В принципе я уже (вчера) наконец-таки разобрался. Очень печально, что в документации по этому поводу всё так скудно, а достаточно было написать пару примеров с кодом. Я это добавлю здесь в ответы, чтобы людям на будущее не нужно было тратить несколько суток на поиски решения.Решения вопроса 1
Максим Зубенко @JawsIk Автор вопроса
Python Django, Lua, ЧПУ-станки(ArtCam, Aspire)Итак, как было в теме, я задавал два вопроса. Отвечу на них по порядку, чтобы людям сразу наглядно было понятно что сделать, чтобы получить результат. Очень меня печалит документация по Django. Вроде бы всё есть, но в итоге нет примеров. А как сказал мой один хороший учитель (не по Django а вообще по программированию): "Документация без примеров кода, это просто справочник. И если ты не специалист, то грош цена такому справочнику". Поэтому я просто приведу два примера кода, после которого сразу всё станет ясно.
Вопрос 1: Опознавание ролей (групп) программно.
В примере будет показан программный код метода account_view из файла views.py, который будет опознавать разные группы пользователей. Для примера в админке была создана группа manager. Ей не были даны специальные разрешения (permissions) и она служит лишь для декоративного разделения, но в программном коде даже такое декоративное разделение позволяет прекрасно опознавать и распределять пользователей. Так же прошу не обращать на функционал корзинки, здесь он оставлен только для того, чтобы показать на какой стадии нужно вставлять условия. Так же нужно понимать, что в каждом условии кроме имени шаблона могут быть (при необходимости) добавлены свои параметры, которые потом можно передать в шаблон.def account_view(request): cart = Cart() cart_id = cart.get_cart_id(request) items_in_cart = CartItems.objects.filter(cart_id=cart_id) # если не опознан, то дуй на страницу регистрирации if not request.user.is_authenticated: return HttpResponseRedirect(reverse('registration')) # если это суперпользователь if request.user.is_superuser: template = 'account_admin.html' # или если это пользователь с галочкой персонал, а так же принадлежащий группе manager elif request.user.is_staff and request.user.groups.filter(name='manager').exists(): template = 'account_personal_role.html' # или если это просто пользователь с галочкой персонал elif request.user.is_staff: template = 'account_personal.html' # или если это пользователь принадлежащий группе manager elif request.user.groups.filter(name='manager').exists(): template = 'account_role.html' # иначе все остальные (обычные пользователи) else: template = 'account.html' # сортировка выдачи заказов в обратном порядке (от последнего к первому) list_orders = Order.objects.filter(user=request.user).order_by('-id') orders = OrderItems.add_order_info(request, list_orders) context = < 'title': 'Кабинет пользователя', 'orders': orders, 'cart': items_in_cart, 'total_cost': cart_id.total_cost, >return render(request, template, context=context)Как видно из кода здесь имеет место быть некоторая последовательность. В частности, если второе условие (первый elif) опустить ниже, то возможна неверная работа, т.к. тогда пользователь принадлежащий группе manager и с галочкой персонала, может легко заскочить в чужой шаблон (по одному условию), поэтому при создании сложных условий, этот момент нужно учитывать.
Вопрос 2: Программное добавление пользователей в группу (или в несколько сразу)
Иногда бывает, что (например) при регистрации, нужно сразу добавить пользователя в определённую группу. Для примера была создана группа clients. Это чисто декоративное разделение. Группа не имеет никаких разрешений в админке, но выполняет свою задачу. Ниже представлен код метода registration_view из файла views.py , т.е. регистрации пользователя и этот новый пользователь после регистрации будет уже принадлежать группе clients. Кстати, чтобы код работал нужно выполнить необходимый импорт, это тоже в коде показано.. from django.contrib.auth.models import Group . def registration_view(request): # (предотвращаем заход по прямой ссылке) # если авторизован, то if request.user.is_authenticated: return HttpResponseRedirect(reverse('account')) form = RegistrationForm(request.POST or None) if form.is_valid(): new_user = form.save(commit=False) new_user.username = form.cleaned_data['username'] new_user.set_password(form.cleaned_data['password']) # вот из-за этой бяки вся засада была у меня с паролями ЗАПОМНИ. new_user.email = form.cleaned_data['email'] new_user.first_name = form.cleaned_data['first_name'] new_user.last_name = form.cleaned_data['last_name'] new_user.save() # после собственно регистрации (сохранения нового) пользователя его можно добавить к группам new_user.groups.add(Group.objects.get(name='clients')) # new_user.groups.add(Group.objects.get(name='manager')) # и в ещё одну группу работает тоже login_user = authenticate(request, username=form.cleaned_data['username'], password=form.cleaned_data['password']) if login_user: login(request, login_user) return HttpResponseRedirect(reverse('account')) context = < 'title': 'Регистрация', 'form': form, >return render(request, 'registration.html', context)Как видно в коде после создания пользователя, он добавляется к (уже созданной предварительно) группе и теперь зайдя в админку, мы это можем легко проверить. Кроме того, в коде закомментирована строчка с добавлением в ещё одну группу manager. Если её раскомментировать, то пользователь будет добавлен сразу в две группы. Т.о. можно добавлять пользователей сразу в несколько групп (если в этом есть необходимость). Естественно нужно понимать, что подобное добавление в группу можно делать не только при регистрации, но видя этот код, сделать необходимое решение уже не должно составлять большого труда.
Надеюсь код пригодиться людям.
Django Admin — Python: Разработка на фреймворке Django
Создание раздела администратора, через который пользователи смогут добавлять, изменять и удалять данные — утомительная работа. Она не требует творческого подхода. По этой причине Django полностью автоматизирует создание раздела администратора на основе моделей.
Django разрабатывался с упором на разделение сайта на две части: редактирование контента и просмотр контента. В этом уроке мы разберем работу с Django Admin, который администраторы сайта используют, чтобы добавлять контент на сайт. И он будет отображаться для всех посетителей сайта. Django Admin не предназначен для использования обычными посетителями, это место для управления сайтом.
Создание суперпользователя
Если мы посмотрим на наш главный файл urls.py, то увидим, что по умолчанию раздел администратора у нас подключен:
urlpatterns = [ # . path('admin/', admin.site.urls), ]Если перейти по данному адресу, откроется страница для входа в раздел администратора:
Чтобы войти в раздел администратора, нам необходимо иметь учетную запись пользователя со статусом Staff. Мы можем создать учетную запись superuser, у которой есть полный доступ к сайту и все необходимые разрешения. Для этого выполним следующую команду и заполним информацию о себе:
********** Password (again): ********** Superuser created successfully.Теперь мы можем зайти в админку под созданной учетной записью:
В этом разделе мы видим все наши модели, которые сгруппированы по установленному приложению. Пока мы видим несколько типов редактируемого контента: группы и пользователи. Они предоставляются django.contrib.auth платформой аутентификации, которая поставляется Django.
Регистрация моделей
Чтобы добавить в админку наши модели для редактирования, нам нужно отредактировать файл admin.py. Он расположен внутри приложения:
from django.contrib import admin from .models import Article admin.site.register(Article)Мы зарегистрировали нашу модель в админке, и при обновлении страницы у нас появится новый раздел:
Теперь через новый раздел мы можем управлять данными в модели: добавлять, редактировать и удалять. Но если откроем список статей, увидим следующие названия:
Такие названия задаются методом __str__ , который по умолчанию состоит из названия класса и id записи в базе данных. Чтобы привести данный список к более читаемому и понятному виду, нам нужно в классе модели переопределить данный метод:
class Article(models.Model): name = models.CharField(max_length=200) body = models.TextField() created_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.nameВ данном примере мы указываем, что в качестве названия объекта нужно возвращать значение поля name . Так в качестве названия мы можем использовать любые поля, их комбинации или брать поля из связанных моделей. Теперь наш список будет выглядеть более читаемым для человека:
Настройка отображения
Возможности Django Admin на этом не заканчиваются. Например, при помощи дополнительных параметров можно производить фильтрации списков по параметрам, ограничивать список выдачи по авторам, организовывать поиск.
Попробуем добавить поисковую форму, чтобы можно было найти нужную статью по названию. Для этого изменим содержание файла admin.py:
from django.contrib import admin from .models import Article class ArticleAdmin(admin.ModelAdmin): search_fields = ['name', 'body'] admin.site.register(Article, ArticleAdmin)Мы добавили класс, который описывает дополнительные свойства для отображения и работы с нашей моделью в разделе администратора. В данном случае мы указали поле search_fields , в которое передали списком названия полей. По ним будет осуществляться поиск. Всю остальную работу по добавлению поля для ввода поискового запроса, контекстному поиску по выбранным полям на себя берет Django Admin:
Мы можем улучшить читаемость нашего кода, если воспользуемся декоратором @admin.register() . Он позволяет связать модель с классом и провести регистрацию модели в разделе администратора:
from django.contrib import admin from .models import Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): search_fields = ['name', 'body']Еще добавим отображение в списке статей даты публикации и фильтрацию по данному полю:
from django.contrib import admin from django.contrib.admin import DateFieldListFilter from .models import Article @admin.register(Article) class ArticleAdmin(admin.ModelAdmin): list_display = ('name', 'timestamp') # Перечисляем поля, отображаемые в таблице списка статей search_fields = ['name', 'body'] list_filter = (('timestamp', DateFieldListFilter),) # Перечисляем поля для фильтрацииОткрыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
- 130 курсов, 2000+ часов теории
- 1000 практических заданий в браузере
- 360 000 студентов
Наши выпускники работают в компаниях:




