Я реализовал разрешение на уровне строк в моем приложении администратора django. У меня есть три модели:
Курс - {Название, код}
Единица - {Заголовок, Курс (внешний ключ)}
- Тема - {Заголовок, Единица (внешний ключ)}
Примечание: (слова, выделенные жирным шрифтом, являются названиями моделей, а значения в фигурных скобках - полями для каждой модели)
Каждый пользователь имеет право добавлять / редактировать / удалять определенные курсы, которые ему назначены. Я использую метод def queryset(self, request):
, чтобы проверить, у какого пользователя есть разрешение на какие курсы, а затем вернуть набор запросов с этими курсами. Таким образом, я могу отображать определенные курсы пользователя, назначенные ему / ей.
A курс может иметь много юнитов, и далее юнит может иметь много тем. Это иерархия.
Так что я снова использую тот же def queryset(self, request):
для фильтрации Юнитов и Тем, чтобы показать только те Единицы и Темы, которые входят в курс, назначенные ему / ей. До сих пор все идет хорошо, так как пользователь может видеть только те Единицы и тем , которые связаны с его / ее курсом . Но когда пользователь пытается редактировать единицу, появляется форма с двумя полями:
- Заголовок (название единицы, которую он может переименовать)
- курс (выпадающий список всех курсов, из которых он может выбрать любой / внешний ключ)
Во втором поле раскрывающийся список "курс" Я просто хочу, чтобы пользователь мог видеть только те курсы, которые ему назначены. Поэтому он / она не сможет обновлять Подразделение с любым другим курсом, который ему не назначен.
Тот же случай, что и при редактировании Темы , пользователь может видеть все Единицы в раскрывающемся поле и может выбрать любую единицу для темы.
Я думаю, мне нужно переопределить какое-то представление или сделать что-нибудь волшебное, но не могу выяснить.