Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Python/Django] menu dynamique

    25 octobre 2008 à 13:25:57

    Bonjour,

    J'aimerais réaliser une application permettant de réaliser des menus que l'utilisateur peut configurer via le panel d'administration.

    Pour cela j'ai créer l'application "menus".

    Le models.py contient :
    #-*- coding: utf-8 -*-
    
    from django.db import models
    
    class Lien(models.Model):
        """Un lien"""
        nom = models.CharField(max_length=10) # réduit pour passer dans les cases
        description = models.CharField(max_length=100)
        lien = models.URLField() # par défaut vérifie si le lien existe!
    
        def __unicode__(self):
            return self.nom
    
    class Menu(models.Model):
        """Un menu"""
        nom = models.CharField(max_length=10)
        items = models.ManyToManyField(Lien)
    
    
        def __unicode__(self):
            return self.nom
    


    Comme cette application doit-etre présente sur toutes les pages, je lui fait appel via la méthode RequestContext().$

    La fonction qui est appelé alors est :externe.menus.context_processors.create_menu :
    from externe.menus.models import Menu,Lien
    
    def create_menu(request):
        """ Crée les différents menus !"""
        liens_un_menu=[]
        menu_complet={} # un menucomplet : titre+liens
        menus_complet=[] #les menus classés
    
    
        for menu in Menu.objects.all():
            liens_un_menu = menu.items.all()
            menu_complet= {'nom': menu, 'items': liens_un_menu}
            menus_complet += menu_complet
    
        return {'MENUS': menus_complet}
    


    Le template utilisé (base.html) est le suivant :
    <div id="leftcolumn">
            {% if MENUS %}
            <div id="menus">
                {% for menu in MENUS %}
                <p>{{ menu }} , {{ menu.nom }} , {{menu.items}} </p>
                <div class="menu">
                     <h3>{{ menu.nom }}</h3>
                     <ul>
                         {% for item in menu.items %}
                           <li><a href="{{ item.lien }}">{{item.nom}}</a></li>
                         {% endfor%}
                     </ul>
                </div>
                {% endfor %}
           </div>
           {% endif %}
        </div>
    



    Cependant, lors du rendu j'obtiens cela :
    <div id="leftcolumn">
            
            <div id="menus">
                
                <p>nom , &lt;invalid&gt; , &lt;invalid&gt; </p>
                <div class="menu">
                     <h3>&lt;invalid&gt;</h3>
    
                     <ul>
                          
                     </ul>
                </div>
                
                <p>items , &lt;invalid&gt; , &lt;invalid&gt; </p>
                <div class="menu">
                     <h3>&lt;invalid&gt;</h3>
    
                     <ul>
                          
                     </ul>
                </div>
                
                <p>nom , &lt;invalid&gt; , &lt;invalid&gt; </p>
                <div class="menu">
                     <h3>&lt;invalid&gt;</h3>
    
                     <ul>
                          
                     </ul>
                </div>
                
                <p>items , &lt;invalid&gt; , &lt;invalid&gt; </p>
                <div class="menu">
                     <h3>&lt;invalid&gt;</h3>
    
                     <ul>
                          
                     </ul>
                </div>
                
           </div>
           
        </div>
    


    <invalid> étant chez moi la valeur de TEMPLATE_STRING_IF_INVALID

    Je pense que je n'utilise pas les bonnes méthodes pour obtenir les entrées de la base de données, mais je n'ai pas trouvé comment faire.

    Je m'en remets donc à vous ! Merci d'avance :-)


    EDIT : ah, et je n'ai trouvé personne faisant cela, est-ce bien la bonne méthode ?

    EDIT2 : résolu ... il fallait faire :

    menus_complet.append(dict(menu_complet))
    


    au lieu de :

    menus_complet += menu_complet
    


    ... :euh:^^
    • Partager sur Facebook
    • Partager sur Twitter

    [Python/Django] menu dynamique

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown