【问题标题】:Using the Django sites framework in the Django admin在 Django 管理中使用 Django 站点框架
【发布时间】:2017-10-24 01:24:33
【问题描述】:

我是第一次使用 Django 站点框架实现一个解决方案,但不确定是否有更好的方法在 Django admin 上实现它。

目前我让它在前端工作,但我希望限制用户只管理属于“他们”站点的后端内容(每个用户都分配到一个站点)。

目前为此,我通过在 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)

save_model 用于确保如果非超级用户保存新条目,则默认为他们的站点:

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

    obj.save()

考虑到使用站点框架来限制内容的前端显示非常简单(使用模型管理器),这感觉非常繁重。有没有更好的方法来解决这个问题?

谢谢!

【问题讨论】:

    标签: python django


    【解决方案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 管理器,会有某种 on_site 用户权限可用于控制在 Django 管理员中可以看到/添加/编辑的内容等.
    • 很高兴能帮上忙。祝您的项目一切顺利
    猜你喜欢
    • 2011-09-23
    • 1970-01-01
    • 2014-08-20
    • 2012-05-06
    • 2011-06-24
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多