2016-02-24 1 views
0

Je travaille sur un menu dynamique pour un commerce électronique et je suis sur le point d'utiliser le context_processor. Je veux que le menu soit affiché dans tous les modèles et ce menu peut changer (ajouter/enlever des options) d'admin.Processeur de contexte de menu dynamique Django

Le problème est, lors de la création du menu dans le context_processor, j'accèderai à la base de données chaque fois que je charge une page? cela ne semble pas très optimal pour un menu. Y a-t-il une autre approche à considérer? En écrivant un tag de modèle personnalisé, je vais avoir le même problème.

+0

Si votre menu est stocké dans la base de données, alors bien sûr vous accéderez à la base de données chaque fois que vous l'interrogerez. Pourquoi pensez-vous que c'est un problème? –

Répondre

0

Potentiellement oui, vous utiliserez cette base de données pour chaque accès à la page. Je suggère d'utiliser la mise en cache. Django fournit certaines fonctions pour la mise en cache que vous pouvez utiliser (docs here).

Vous pouvez le faire dans le modèle et au lieu d'un processeur de contexte créer un template tag.

{% load cache %} 
{% load menu %} 
{% cache 500 menu "unique-options" %} 
    {% generate_menu %} 
{% endcache %} 

Là où j'ai mis « -options uniques » vous devez inclure une chaîne qui est spécifique à la version du menu que vous utilisez. Donc, si vous en avez un qui est pour les utilisateurs qui sont le personnel et pour ceux qui ne sont pas, vous pouvez utiliser request.user.is_staff pour différencier les types de menu, sinon le cache peut servir le mauvais menu aux gens.

Vous pouvez également le faire dans le cadre de la fonction elle-même, cela fonctionnerait si vous utilisez un processeur de contexte ou un tag de modèle.

from django.core.cache import cache 

def generate_menu(): 
    menu_cache_key = "menu" + differentiating_string 
    menu = cache.get(menu_cache_key) 
    if menu: 
     return menu 
    ...steps to generate menu here... 
    cache.set(menu_cache_key, menu, 500) 
    return menu