【问题标题】:Django permissions separate users by countryDjango 权限按国家/地区分隔用户
【发布时间】:2015-05-05 10:11:36
【问题描述】:


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

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

【问题讨论】:

    标签: django permissions


    【解决方案1】:

    你的想法是正确的。这是过滤管理员可见的对象的正确方法。

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

    【讨论】:

    • 我尝试了您的代码并遇到了一些问题,我已经通过与 UserProfile 的 OneToOne 关系扩展了用户,并且我想在属于 UserProfile 而不是标准用户模型的字段上精确过滤并且代码在这里似乎对我不起作用。由于 User 模型已扩展,我仍然可以将字段称为“country=request.user.profile.country”,至少我是这么认为的。我的管理员仍然可以看到 admintool 中的所有用户,这可能是什么问题?
    • 如果您以超级用户身份登录,您将看到所有UserProfiles。
    • 您要过滤UserProfile admin 还是标准User 模型admin?
    • 实际上我想过滤两者。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 2014-11-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 2015-01-07
    相关资源
    最近更新 更多