繁体   English   中英

通过登录用户过滤django admin(显示外键)

[英]Filter django admin by logged in user (Foreign Key showing up)

我希望管理员用户只能看到他们创建的模型实例。 我按照这些说明通过登录用户筛选django admin

class FilterUserAdmin(admin.ModelAdmin): 
    def save_model(self, request, obj, form, change):
        if getattr(obj, 'user', None) is None:  #Assign user only the first time, superusers can edit without changing user
            obj.user = request.user
        obj.save()
    def queryset(self, request):
        qs = super(FilterUserAdmin, self).queryset(request)
        if request.user.is_superuser:
            return qs
        return qs.filter(user=request.user)
    def has_change_permission(self, request, obj=None):
        if not obj:
            # the changelist itself
            print('query change')
            return True # So they can see the change list page
        return obj.user == request.user or request.user.is_superuser


class CampaignAdmin(FilterUserAdmin):
   ...

这就是我的代码的样子。 一切正常。 我需要一个以活动为外键的模型。

class ScreenAdmin(FilterUserAdmin):
   ...

admin.site.register(Campaign,CampaignAdmin)
admin.site.register(Screen,ScreenAdmin)

现在,当我进入屏幕时,我看到其他用户创建的广告系列可供选择

我不希望能够选择其他用户的广告系列

更新 :这是我目前的get_form

class ScreenAdmin(FilterUserAdmin):
    list_display = ('screen_name', 'id','screen_URL')
    def get_form(self, request, obj=None, **kwargs):
        self.exclude = ["beacon"]
        if not request.user.is_superuser:
            self.exclude.append('user') #here!
        form = super(ScreenAdmin, self).get_form(request, obj, **kwargs)
        #print(vars(form))
        form.base_fields['campaign'].queryset = Campaign.objects.filter(user=request.user)
        return form
  def changelist_view(self, request, extra_context=None):
    if request.user.is_superuser:
        self.list_display = ('screen_name','user', 'id','screen_URL')
    #print('Change List######')
    return super(ScreenAdmin, self).changelist_view(request, extra_context)

这个解决方案非常理智且有效

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

除非你被标记为超级用户,否则这可能就是你所做的。

要访问管理界面,您必须将用户检查为“staff”(is_staff)

如果你检查“超级用户”,你将看到所有的数据,所以创建其他用户(为测试)添加他适当的权限,但不要将mim标记为超级用户,只有is_staff并测试它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM