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

テンプレートにラムダ式を返すようにしてください:

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

そうすれば、コンパイル/キャッシュされず、動的に動作します。

于 2013-04-19T05:51:09.760 に答える