Django权限按国家/地区分隔用户

时间:2015-05-05 10:11:37

标签: django permissions


我有一个关于权限的问题。我想将通过国家/地区标记为员工(并可以进入管理页面)的用户分开。例如,来自荷兰的管理员只能查看和编辑来自荷兰的用户。这样做的最佳方法是什么?
我应该以某种方式进行查询,以便用户只能看到自己国家/地区的用户,而不是可以使用权限自定义用户?

我的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)

1 个答案:

答案 0 :(得分: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)

更新:要过滤标准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)