Django 权限按国家区分用户

Django permissions separate users by country


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

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

您的思考方向是正确的。这是过滤管理员可见对象的正确方法。

小更正:方法的名称是 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)