基于用户自定义feincms页面管理器

6 投票
2 回答
572 浏览
提问于 2025-04-17 15:21

我正在寻找一种方法,根据用户提供的信息来过滤管理后台的页面对象查询集。我考虑过的(伪代码)是:

from feincms... Page

class MyPageAdmin(PageAdmin):
    def __init__(self, *args, **kwargs):
        'monkey business'
        super(MyPageAdmin, self).__init__(*args, **kwargs)

admin.site.unregister(Page)
admin.site.register(Page, MyPageAdmin)

这样做行不通,因为feincms需要一个完全加载的django实例。一个比较复杂的解决方案可能是根本不加载页面模块,而是重写页面模型对象或管理后台,比如:

from feincms... PageAdmin

class MyPage(Page):
    objects = CustomManager()

admin.site.register(MyPage, PageAdmin)

文档中提到可以以类似的方式设置你自己的页面模块,但这似乎对于一个简单的需求来说配置太多了。

有没有更简单的方法来重写feincms模块的管理查询集或模型管理呢?

2 个回答

3

这里的关键是,你不能取消注册feincms模块,因为它们有一些特殊的处理。与其自己注册一个feincms的页面对象,不如像这样修改它的方法:

from django.conf import settings
from feincms.module.page.models import PageAdmin

def queryset(self, request):
    qs = super(PageAdmin, self).queryset(request)
    if request.user.is_superuser:
        return qs
    return qs.filter(site__id__exact=settings.SITE_ID)
PageAdmin.queryset = queryset
6

FeinCMS v1.7 还允许你在 Django 的设置中把 FEINCMS_USE_PAGE_ADMIN=False 进行设置。

然后,你可以像平常一样去创建一个 PageAdmin 的子类,并自己把模型的管理注册上去。

如果你在使用 v1.7,记得开始从 feincms.module.page.modeladmins 导入 PageAdmin

撰写回答