2010-06-01 4 views
1

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

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

Мысли:

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

ответ

7

Вы можете переопределить админ 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 используется только при получении запроса администратора для получения также связанных данных из отношений немедленно, а не тогда, когда это необходимо!

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

+1

Ваш первый мир кода работал отлично. Я также нашел его здесь: http://www.ibm.com/developerworks/opensource/library/os-django-admin/index.html – Jonathan

Смежные вопросы