Фильтрация экземпляров модели на основе пользователя в администраторе django - PullRequest
1 голос
/ 01 июня 2010

Я использую администратор django, чтобы позволить пользователям управлять экземплярами модели конкретной модели. Каждый пользователь должен иметь возможность управлять только своими экземплярами модели. (кроме администраторов, которые должны управлять всеми).

Как отфильтровать объекты в представлении админ-листа?

Мысль:

  • Полагаю, самый элегантный подход - использовать Разрешения на уровне объекта . Кто-нибудь знает о реализации этого?
  • Можно ли это сделать, переопределив представление администратора с помощью ModelAdmin.changelist_view?
  • Имеет ли list_select_related какое-либо отношение к этому?

1 Ответ

7 голосов
/ 02 июня 2010

Вы можете переопределить метод администратора queryset, чтобы просто отображать элементы пользователя:

    def queryset(self, request):
        user = getattr(request, 'user', None)
        qs = super(MyAdmin, self).queryset(request)
        if user.is_superuser:
            return qs
        return qs.filter(user=user)

Кроме того, вам также следует позаботиться о has_change_permission и has_delete_permission -методах, например:

    def has_delete_permission(self, request, obj=None):   
        if not request.user == obj.user and not request.user.is_superuser:
            return False
        return super(MyAdmin, self).has_delete_permission(request, obj)

То же самое для has_change_permission! list_select_related используется только при получении набора запросов администратора для немедленного извлечения связанных данных из отношений, а не тогда, когда это необходимо!

Если ваша основная цель состоит только в том, чтобы ограничить пользователя неспособностью работать с другими объектами, вышеуказанный подход будет работать, если он усложняется, и вы не можете определить полномочия просто из ОДНОГО атрибута, такого как пользователь, Изучите предложения django по разрешениям на уровне строк!

...