Django-fr

Forum

#1 27-08-2010 12:20:20

papayou
Membre
Inscription : 27-08-2010
Messages : 2

Pb avec les templates et la relation many to many

Bonjour,
nouveau, je découvre Django en réalisant un site de e-commerce.
Je me trouve coincé avec l'utilisation de boucle imbriquée et les templates.
Le but : Je crée des menus et les affichés dans deux pages différentes.
Sur la première sans Pb j'affiche menu par menu en ayant :

model
class Menu(models.Model) :
    """Enregistrement de tous les menus proposé"""
    nom = models.CharField(max_length=255, unique=True)
    slug = models.SlugField(max_length=255, unique=True, help_text='valeur unique pour chaque page créé, fabriqué à partir du nom')
    prix = models.DecimalField(max_digits=9, decimal_places=2, default=0.00)
    remarques = models.TextField(blank=True)
    image = models.ImageField(upload_to="/images/menu", blank=True)
    meta_keywords = models.CharField(max_length=255, help_text='utilisé une virgule entre chaque mot.')
    meta_description = models.CharField(max_length=255, help_text='contenu pour le meta tag description.')
    creer_le = models.DateTimeField(auto_now_add=True)
    modifier_le = models.DateTimeField(auto_now=True)
    actif = models.BooleanField(default=True)
    compositions = models.ManyToManyField(Categorie)

views
def show_menu(request, menu_slug, template_name="formules/menu.html") :
    """Fournis les éléments pour les pages de menu du module"""
    m = get_object_or_404(Menu, slug=menu_slug)
    categories = m.compositions.filter(actif=True)
    page_title = m.nom
    meta_keywords = m.meta_keywords
    meta_description = m.meta_description
    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

template
{% extends "commande.html" %}

{% block content %}
    <div class="menuImg">
        <img src="{{ MEDIA_URL }}images/menu/{{ m.image }}" alt="{{ m.nom }}" />
    </div>
    <h1>{{ m.nom }}</h1>
    <br/>
    Composition :
    {% for c in categories %}
        <a href="{{ c.get_absolute_url }}">{{ c.nom }}</a>
        {% if not forloop.last %} + {% endif %}
    {% endfor %}
    <br/>
    Prix : {{ m.prix }} €
    <br/>
    Remarques : {{ m.remarques }}
{% endblock %}

par contre sur la deuxième je veux tous les menus avec les mêmes infos et là j'ai une erreur

views
def menus(request, template_name="formules/menus.html") :
    """Fournis les éléments pour la page menus du module"""
    menus = Menu.objects.filter(actif=True)
    page_title = 'Faites votre choix'
    return render_to_response(template_name, locals(), context_instance=RequestContext(request))

template
{% extends "commande.html" %}

{% block content %}
    {% for m in menus %}
        <div class="menu">
            <h1>{{ m.nom }}</h1>
            {% for cat in m.compositions %}
                {{ cat.nom }}
                {% if not forloop.last %} + {% endif %}
            {% endfor %}
            <br/>
            Prix : {{ m.prix }} €
            <br/>
            [Bouton Ajouté au panier]
            <br/><br/>
        </div>
    {% endfor %}   
{% endblock %}

erreur
TemplateSyntaxError
Exception Value :     Caught TypeError while rendering: 'ManyRelatedManager' object is not iterable

Hors ligne

#2 27-08-2010 12:49:29

David Thenon
Membre
Inscription : 11-08-2010
Messages : 156
Site Web

Re : Pb avec les templates et la relation many to many

Salut,

Comme le dit l'exception tu essayes d'itérer sur l'objet du manager
(m.compositions) de ta relation, alors que tu es censé utiliser ses méthodes
de queryset (par exemple all() tel que m.compositions.all ).

Donc ton template devrais plutôt ressembler à ça :

template
{% extends "commande.html" %}

{% block content %}
    {% for m in menus %}
        <div class="menu">
            <h1>{{ m.nom }}</h1>
            {% for cat in m.compositions.all %}
                {{ cat.nom }}
                {% if not forloop.last %} + {% endif %}
            {% endfor %}
            <br/>
                        Prix : {{ m.prix }} €
                        <br/>
                        [Bouton Ajouté au panier]
                        <br/><br/>
                </div>
    {% endfor %}       
{% endblock %}

Le vendredi 27 août 2010 13:20:20, patrick a écrit :
> Bonjour,
> nouveau, je découvre Django en réalisant un site de e-commerce.
> Je me trouve coincé avec l'utilisation de boucle imbriquée et les
> templates.
> Le but : Je crée des menus et les affichés dans deux pages
> différentes.
> Sur la première sans Pb j'affiche menu par menu en ayant :
>
> model
> class Menu(models.Model) :
>     """Enregistrement de tous les menus proposé"""
>     nom = models.CharField(max_length=255, unique=True)
>     slug = models.SlugField(max_length=255, unique=True, help_text='valeur
> unique pour chaque page créé, fabriqué à partir du nom')
>     prix = models.DecimalField(max_digits=9, decimal_places=2,
> default=0.00)
>     remarques = models.TextField(blank=True)
>     image = models.ImageField(upload_to="/images/menu", blank=True)
>     meta_keywords = models.CharField(max_length=255, help_text='utilisé
> une virgule entre chaque mot.')
>     meta_description = models.CharField(max_length=255, help_text='contenu
> pour le meta tag description.')
>     creer_le = models.DateTimeField(auto_now_add=True)
>     modifier_le = models.DateTimeField(auto_now=True)
>     actif = models.BooleanField(default=True)
>     compositions = models.ManyToManyField(Categorie)
>
> views
> def show_menu(request, menu_slug, template_name="formules/menu.html") :
>     """Fournis les éléments pour les pages de menu du module"""
>     m = get_object_or_404(Menu, slug=menu_slug)
>     categories = m.compositions.filter(actif=True)
>     page_title = m.nom
>     meta_keywords = m.meta_keywords
>     meta_description = m.meta_description
>     return render_to_response(template_name, locals(),
> context_instance=RequestContext(request))
>
> template
> {% extends "commande.html" %}
>
> {% block content %}
>     <div class="menuImg">
>         <img src="{{ MEDIA_URL }}images/menu/{{ m.image }}" alt="{{ m.nom
}}" />
>     </div>
>     <h1>{{ m.nom }}</h1>
>     <br/>
>     Composition :
>     {% for c in categories %}
>         <a href="{{ c.get_absolute_url }}">{{ c.nom }}</a>
>         {% if not forloop.last %} + {% endif %}
>     {% endfor %}
>     <br/>
>     Prix : {{ m.prix }} €
>     <br/>
>     Remarques : {{ m.remarques }}
> {% endblock %}
>
> par contre sur la deuxième je veux tous les menus avec les mêmes infos
> et là j'ai une erreur
>
> views
> def menus(request, template_name="formules/menus.html") :
>     """Fournis les éléments pour la page menus du module"""
>     menus = Menu.objects.filter(actif=True)
>     page_title = 'Faites votre choix'
>     return render_to_response(template_name, locals(),
> context_instance=RequestContext(request))
>
> template
> {% extends "commande.html" %}
>
> {% block content %}
>     {% for m in menus %}
>         <div class="menu">
>             <h1>{{ m.nom }}</h1>
>             {% for cat in m.compositions %}
>                 {{ cat.nom }}
>                 {% if not forloop.last %} + {% endif %}
>             {% endfor %}
>             <br/>
>             Prix : {{ m.prix }} €
>             <br/>
>             [Bouton Ajouté au panier]
>             <br/><br/>
>         </div>
>     {% endfor %}
> {% endblock %}
>
> erreur
> TemplateSyntaxError
> Exception Value :     Caught TypeError while rendering: 'ManyRelatedManager'
> object is not iterable
> _______________________________________________
> django mailing list
> django _AT_ lists.afpy.org
> http://lists.afpy.org/mailman/listinfo/django

Hors ligne

#3 27-08-2010 12:57:47

papayou
Membre
Inscription : 27-08-2010
Messages : 2

Re : Pb avec les templates et la relation many to many

Merci beaucoup cela fonctionne bien mieux effectivement.

Hors ligne

Pied de page des forums