2015-05-05 2 views
0


У меня есть вопрос относительно разрешений. Я хотел бы отделить моих пользователей, отмеченных как Персонал (и может войти на страницу администрирования) через страны. Так, например, администратор из Нидерландов может видеть и редактировать пользователей из Нидерландов. Каков наилучший способ сделать это?
Должен ли я делать запросы таким образом, чтобы пользователи могли видеть только пользователей из своей страны, и я могу настроить его с разрешениями?
Django разрешений отдельных пользователей по странам

мой models.py определяет страну

class UserProfile(models.Model): 

    user = models.OneToOneField(User, related_name='profile', unique=True) 
    country = models.CharField("Country", max_length=150, blank=False) 

, и я подумал о чем-то вроде этого в admin.py

def queryset(self, request): 
    qs = super(ProfileAdmin, self).queryset(request) 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(country=request.user.country) 

ответ

0

Вы думаете в правильном направлении. Это правильный способ фильтрации объектов, видимых для администраторов.

Небольшие исправления: название метода является get_queryset() и получить доступ к стране пользователя следует использовать profile соотношение:

def get_queryset(self, request): 
    qs = super(ProfileAdmin, self).get_queryset(request) 
    if request.user.is_superuser: 
     return qs 
    return qs.filter(country=request.user.profile.country) 

UPDATE: Для того, чтобы фильтровать пользователей в стандартном User администратора вы должны заменить UserAdmin с вашим собственным подклассом:

from django.contrib.auth.admin import UserAdmin 
from django.contrib.auth.models import User 

class MyUserAdmin(UserAdmin): 

    def get_queryset(self, request): 
     qs = super(MyUserAdmin, self).get_queryset(request) 
     if request.user.is_superuser: 
      return qs 
     return qs.filter(profile__country=request.user.profile.country) 

admin.site.unregister(User) 
admin.site.register(User, MyUserAdmin) 
+0

0: корабль с UserProfile, и я хочу точно фильтровать поле, принадлежащее UserProfile, а не стандартную модель пользователя, и код, похоже, не работает для меня здесь. Так как модель пользователя расширена, я все равно могу назвать поля типа «country = request.user.profile.country», по крайней мере, я так и думал. Что может быть проблемой, что мой администратор все еще видит всех пользователей в admintool? – Vollmilchbb

+0

Вы увидите все 'UserProfile', если вы зарегистрированы как суперпользователь. – catavaran

+0

Вы хотите отфильтровать администратор 'UserProfile' или стандартный администратор модели User? – catavaran

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