2015-10-18 6 views
0

У меня есть приложение app_name, которое имеет объект профиля, который связан с объектом User через поле OneToOne. Теперь при входе я перенаправляю пользователя на страницу профиля редактирования на сайте администратора, используя url, используя свой идентификатор объекта профиля. Я предоставил, как и ожидалось, доступ к is_staff и разрешение редактировать профили.Блокировка URL-адресов в админ-сайте django для пользователей пользователей

Теперь я не хочу, чтобы он не обращался к другим объектам профиля. На данный момент у меня есть два пути, которые я могу представить так: 1. Сделайте специальное разрешение, которое предоставляет доступ к редактированию только для его профиля, который входит в систему. 2. Блокирование URL-адресов, которые не включают идентификатор объекта профиля.

Суперпользователь должен иметь возможность доступа, как обычно, по умолчанию.

Я понятия не имею, как я могу выполнить один из способов. Любые другие возможные способы приветствуются. Пожалуйста помоги!

ответ

0

Override ModelAdmin.get_queryset() может исключить другие объекты:

class ProfileAdmin(ModelAdmin): 
    # current user can only see his profile 
    def get_queryset(self, request): 
     qs = super(ProfileAdmin, self).get_queryset(request) 
     if not request.user.is_superuser: 
      qs = qs.filter(id=request.user.id) 
     return qs 

Если вы хотите, чтобы контролировать разрешение изменения, переопределения ModelAdmin.has_change_permission():

class ProfileAdmin(ModelAdmin): 
    # current user can only edit his profile 
    def has_change_permission(self, request, obj=None): 
     # user has permission to edit a obj 
     if not obj or request.user.is_superuser: 
      return True 
     # user ONLY has permission to edit his obj 
     return request.user.id == obj.user.id 
+0

Сначала один не работает для меня. Это вряд ли имеет значение. Второй метод дает утверждение TypeError: «has_change_permission() принимает не более 2 аргументов (3 данных)» –

+0

Простите, пропустил 'self' в определении метода. Но первый должен работать, 404 будет поднят, когда любой пользователь, который не является суперпользователем, хочет просмотреть профиль другого пользователя. Второй, хотя и может управлять разрешением на изменение, все пользователи могут просматривать список изменений. – JimmyYe