访问 django cms 页面缓存

Access django cms Page cache

我有一个页面扩展,可以将颜色应用于页面。这是通过一个模板标签访问的,该标签检查每个页面的属性,目前这只是 运行ning 一个 Page.objects.filter() 调用,这显然是在破坏数据库,因为每个 nav_node 在菜单中。

Page 模型是否有我可以 运行 reverse_id 过滤器的缓存?我的扩展对象被缓存了,但是当尝试将此过滤器应用于菜单项时,我需要尝试确定 nav_node 是否为 Page,如下所示,因此我必须直接转到对象(或者首先调用缓存?)。

@register.filter(name='colour')
def colour(nav_node):
    """
    Filter receives a CMS menu NavigationNode. We cannot assume this is a Page.

    :param nav_node: a node from the cms menu
    :type nav_node: menus.base.NavigationNode
    :return: colour associated with the Node or None
    :rtype: str
    """
    pages = Page.objects.filter(reverse_id=nav_node.attr['reverse_id'])[0:2]
    page = next((x for x in pages if hasattr(x, 'pagecolourextension')), None)

    if page is None:
        colour = ''
    else:
        colour = page.pagecolourextension.page_colour

    return colour

我在 Page 模型上看不到任何导致页面缓存的内容,但在管理器上有大量调用使页面缓存无效。您如何 运行 对缓存页面进行过滤?

我决定解决这个问题的最佳方法是为 CMS 页面创建我自己的缓存键,我可以用它来访问我的页面扩展,所以我移动了查询数据库的逻辑;

pages = Page.objects.filter(reverse_id=nav_node.attr['reverse_id'])[0:2]
page = next((x for x in pages if hasattr(x, 'pagecolourextension')), None)

将其放入 if cache.get(key): 类型的函数中,这样我就可以通过我的缓存方法访问带有 reverse_id 的页面。这很棒,因为它应该使我能够缓存页面,然后对于我的任何页面扩展调用缓存并基于更改的字段同样触发信号。