繁体   English   中英

自定义上下文处理器中的Django缓存

[英]Django caching in a custom context processor

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

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装饰器,但是可以看到我的页面仍在访问菜单项对象的数据库。

任何帮助,不胜感激。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM