python - 在 Django 管理中使用 Django 站点框架

标签 python django

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

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

目前,为了做到这一点,我通过在 Admin 类中指定相应的字段来拆分可供 super 用户 (is_superuser) 和其他任何人使用的字段。然后我将覆盖以下内容:

get_form 方法根据用户返回不同的表单。例如, super 用户可以为任何站点创建内容,而任何其他用户只能为他们自己的站点创建内容。

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 确保非 super 用户保存新条目时,默认为他们的站点:

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

    obj.save()

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

谢谢!

最佳答案

是的,有。创建您自己的自定义管理基类。从那个派生所有其他管理类。

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

关于python - 在 Django 管理中使用 Django 站点框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44145856/

相关文章:

python - 如何将列表与列表列表合并

python - 需要正则表达式才能在 python 中仅获取 Tably 名称和主键

Python:字符串索引超出范围

python - 当使用 django 进行 API 调用时,Django REST Framework 的好处是什么?

django - 两个字段中的小部件填充值

python - 从另一个调用 Python 脚本并传递 List(sys.argv) 作为参数

python - 分组数据框的滚动操作

Django查询集过滤外键

python - Django 。图片字段。 Django中静态文件的路径

python - 当本地主机正在工作时,我无法通过 IP 地址看到我的 Python Django 服务器