在Django管理后台中使用Django站点框架

4
我第一次使用Django站点框架实现一个解决方案,不确定是否有更好的方式在Django管理界面上实现它。目前我已经在前端工作了,但是我希望用户只能管理后端属于“他们”站点的内容(每个用户都分配给一个站点)。为了实现这一点,目前我正在通过在Admin类中指定相应字段来将超级用户(is_superuser)和其他人可以使用的字段进行分离。然后我重写了以下内容:get_form方法,根据用户返回不同的表单。例如,超级用户可以为任何站点创建内容,而任何其他用户只能为自己的站点创建内容。
def get_form(self, request, obj=None, **kwargs):
    if request.user.is_superuser:
        self.fieldsets = self.user_fieldsets + self.superuser_fieldsets
    else:
        self.fieldsets = self.user_fieldsets

    return super(FaqCategoryAdmin, self).get_form(request, obj, **kwargs)

get_queryset方法用于只显示用户有权限访问的站点相关条目。

def get_queryset(self, request):
    qs = super(FaqCategoryAdmin, self).get_queryset(request)
    if request.user.is_superuser:
        return qs
    else:
        return qs.filter(site=settings.SITE_ID)

在保存模型时,如果非超级用户保存一个新条目,确保默认为他们的站点:

def save_model(self, request, obj, form, change):
    if not request.user.is_superuser:
        obj.site = get_current_site(request)

    obj.save()

这感觉非常繁琐,因为使用网站框架通过模型管理器限制前端内容的显示非常简单。有没有更好的方法?谢谢!
1个回答

1

有的,你可以创建自己的自定义管理员基类。从那个基类派生所有其他管理员类。

class MyAdmin(admin.ModelAdmin):

    def get_form(self, request, obj=None, **kwargs):
        if request.user.is_superuser:
            self.fieldsets = self.user_fieldsets + self.superuser_fieldsets
        else:
            self.fieldsets = self.user_fieldsets

        return super(MyAdmin, self).get_form(request, obj, **kwargs)

    def get_queryset(self, request):
        qs = super(MyAdmin, self).get_queryset(request)
        if request.user.is_superuser:
            return qs
        else:
            return qs.filter(site=settings.SITE_ID)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            obj.site = get_current_site(request)

        obj.save()

然后,

class FaqCategoryAdmin(MyAdmin): 
   # now this class is dry. Because repetitive code is in parent

谢谢,我打算使用一个基类来实现这个功能,只是不确定覆盖方法是否是最佳方式。我希望像在视图中推荐用于处理多个站点的 on_site 管理器一样,在 Django 管理界面中也有一种可以用来控制用户权限的 on_site 用户权限,以便控制能够看到/添加/编辑等内容。 - visionjcv
很高兴能够提供帮助。祝你的项目一切顺利。 - e4c5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接