0

我有一个自定义上下文处理器,用于在站点范围内生成动态菜单和当前应用程序列表:

from portal.models import *

def base_items(request):
    return { 
        ...
        'app_items': App.objects.filter(isonline=True), 
        'menu_items': MainMenu.objects.all().order_by('position'),
    } 

编辑:

我的模板(请注意,这些 url 中的许多都在 Django 框架之外,并且因语言而异。因此需要将它们硬编码到 db 字段中:

<ul class="menu">
            {% for item in menu_items %}
                {% if LANGUAGE_CODE = "en-us" %}
                <li><a title="{{ item.title_en }}" href="{{ item.url_en }}">{{ item.title_en }}</a>
                    <ul>
                    {% for subitem in item.submenu_set.all %}
                        <li><a title="{{ subitem.title_en }}" href="{{ subitem.url_en }}">{{ subitem.title_en }}</a></li>
                    {% endfor %}        
                    </ul>
                </li>
                    {% else %}
                <li><a title="{{ item.title_es }}" href="{{ item.url_es }}">{{ item.title_es }}</a>
                    <ul>
                    {% for subitem in item.submenu_set.all %}
                <li><a title="{{ subitem.title_es }}" href="{{ subitem.url_es }}">{{ subitem.title_es }}</a></li>
                    {% endfor %}        
                    </ul>
                </li>
                {% endif %}
            {% endfor %}    
            </ul>  

我的问题是 - 我如何缓存这些不经常更改的结果?

我已经尝试过 @cache_page 装饰器,但我可以看到我的页面仍在访问菜单项对象的数据库。

非常感谢任何帮助。

4

2 回答 2

3

您可以使用 django低级缓存 API。请注意,您可能必须将查询集强制转换为 list

或者,您可以缓存使用这些查询集的模板片段,因为查询集是惰性的

于 2012-05-15T15:42:52.343 回答
0

尝试将 lamdas 表达式返回到您的模板:

 'app_items': lambda: App.objects.filter(isonline=True), 

这样它就不会被编译/缓存并动态工作。

于 2013-04-19T05:51:09.760 回答