按登录用户筛选Django admin(显示外键)

2024-09-27 17:45:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望管理员用户只看到他们创建的模型实例。我遵循了这些指示Filter django admin by logged in user

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):
   ...

这就是我的代码的样子。一切正常。我需要另一个模型与运动作为外键。在

^{pr2}$

现在当我进入屏幕时,我看到其他用户创建的活动可供选择

我不希望其他用户的活动能够被选中

更新:这是我当前的get_表单

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)

Tags: 用户selfformnoneobjreturnifis
1条回答
网友
1楼 · 发布于 2024-09-27 17:45:33

这个解决方案是非常明智和有效的

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

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

要访问管理界面,您必须将用户勾选为“staff”(是\u staff)

如果你勾选“超级用户”,你会看到所有的数据,所以创建其他用户(用于测试)给他添加适当的权限,但不要将mim标记为超级用户,只不过是用户的工作人员和测试人员。在

相关问题 更多 >

    热门问题