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