46 votes

Comment implémenter des breadcrumbs dans un template Django ?

Les solutions fournies lors d'une recherche Google pour "Django breadcrumbs" incluent l'utilisation de modèles et de block.super, en étendant essentiellement les blocs de base et en y ajoutant la page actuelle. http://www.martin-geber.com/thought/2007/10/25/breadcrumbs-django-templates/

http://www.djangosnippets.org/snippets/1289/ - fournit une balise de modèle mais je ne suis pas sûr que cela fonctionnerait si votre urls.py n'est pas correctement déclaré.

Je me demande quelle est la meilleure façon de faire? Et si vous avez déjà implémenté des breadcrumbs, comment l'avez-vous fait?

--- Edit --

Ma question était censée être : y a-t-il une méthode acceptée généralement pour faire des breadcrumbs en Django, mais d'après les réponses que je vois, ce n'est pas le cas, et il existe de nombreuses solutions différentes. Je ne sais pas à qui attribuer la bonne réponse, car j'ai utilisé une variation de la méthode block.super, alors que toutes les réponses ci-dessous fonctionneraient.

Je suppose alors que c'est une question trop subjective.

0 votes

Je m'en tiendrais à l'implémentation utilisée dans l'admin de django, comme suggéré par @otto-kekäläinen et @yeo. Peut-être que cela ressemble à votre méthode block.super, mais je ne peux pas vérifier, car ce lien ne fonctionne plus. Est-ce quelque chose comme ceci?

45voto

drozzy Points 7887

Note: Je fournis l'extrait complet ci-dessous, car djangosnippets a été capricieux ces derniers temps.

Cool, quelqu'un a réellement trouvé mon extrait de code :-) L'utilisation de ma balise de modèle est plutôt simple.

Pour répondre à votre question, il n'y a pas de mécanisme "intégré" dans django pour gérer les fil d'ariane, mais il nous offre la prochaine meilleure chose : des balises de modèle personnalisées.

Imaginez que vous vouliez avoir des fils d'ariane comme ceci :

Services -> Programmation
Services -> Consulting

Ensuite, vous aurez probablement quelques urls nommées : "services", "programming", "consulting" :

    (r'^services/$',
     'core.views.services',
     {},
     'services'),

    (r'^services/programming$',
     'core.views.programming',
     {},
     'programming'),

    (r'^services/consulting$',
     'core.views.consulting',
     {},
     'consulting'),

Maintenant, à l'intérieur de votre modèle html (regardons simplement la page de consulting) tout ce que vous avez à faire est :

//consulting.html
{% load breadcrumbs %}

{% block breadcrumbs %}
{% breadcrumb_url 'Services' services %}
{% breadcrumb_url 'Consulting' consulting %}

{% endblock %}

Si vous voulez utiliser un certain type de texte personnalisé dans le fil d'ariane, et ne voulez pas le lier, vous pouvez utiliser la balise breadcrumb au lieu de cela.

//consulting.html
{% load breadcrumbs %}

{% block breadcrumbs %}
  {% breadcrumb_url 'Services' services %}
  {% breadcrumb_url 'Consulting' consulting %}
  {% breadcrumb 'Nous sommes géniaux!' %}  
{% endblock %}

Il y a des situations plus complexes où vous pourriez vouloir inclure un id d'un objet particulier, ce qui est également facile à faire. Voici un exemple plus réaliste :

{% load breadcrumbs %}

{% block breadcrumbs %}
{% breadcrumb_url 'Employés' liste_employés %}
{% if employé.id %}
    {% breadcrumb_url employé.nom_entreprise détails_entreprise employé.id %}
    {% breadcrumb_url employé.nom_complet détails_employé employé.id %}
    {% breadcrumb 'Modifier Employé ' %}
{% else %}
    {% breadcrumb 'Nouvel Employé' %}
{% endif %}

{% endblock %}

DaGood snippet de fils d'ariane

Fournit deux balises de modèle à utiliser dans vos modèles HTML : breadcrumb et breadcrumb_url. Le premier permet de créer une simple url, avec la partie texte et la partie url. Ou seulement du texte non lié (comme le dernier élément dans le fil d'ariane par exemple). Le deuxième peut en fait prendre l'url nommée avec des arguments ! De plus, il prend un titre en premier argument.

Il s'agit d'un fichier de templatetag qui doit être placé dans votre répertoire /templatetags.

Changez simplement le chemin de l'image dans la méthode create_crumb et vous êtes prêt !

N'oubliez pas de faire {% load breadcrumbs %} en haut de votre modèle HTML !

0 votes

Je le pense, j'ai visité votre blog, mais une mise à jour avec l'explication ci-dessus serait utile. J'ai implémenté une version de ceci, mais au lieu d'utiliser des liens nommés, j'ai juste utilisé des URLs codées en dur ! Oups ! Je vais essayer d'installer votre filtre de modèle ! Merci

0 votes

Mon principal problème avec cela est que cela produit : une flèche avant le premier composant de fil d'Ariane. Donc au lieu de "Accueil > Biologie", j'obtiens "> Accueil > Biologie"

0 votes

Vrai, je pense que c'était intentionnel de ma part. Comme "Accueil" est généralement un lien statique qui peut être défini avant les miettes de pain. Je suppose qu'on pourrait créer une classe NoArrowUrlNode qui appellera la nouvelle fonction create_crumb_no_arrow.

15voto

Otto Kekäläinen Points 201

Les modules de vue d'administration de Django ont des miettes de pain automatiques, qui sont implémentées comme ceci:

{% block breadcrumbs %}

        {% trans 'Accueil' %}
        {% block crumbs %}
            {% if title %} › {{ title }}{% endif %}
        {% endblock %}

{% endblock %}

Il y a donc une sorte de support intégré pour cela.

0 votes

Merci!! cette approche simple est censée être la bonne réponse

7voto

S.Lott Points 207588

Mes fonctions de vue émettent les fil d'ariane comme une simple liste.

Certaines informations sont conservées dans la session de l'utilisateur. Indirectement, cependant, elles proviennent des URL.

Les fil d'ariane ne sont pas une simple liste linéaire de là où ils ont été -- c'est ce que l'historique du navigateur est destiné à faire. Une simple liste de là où ils ont été ne constitue pas un bon fil d'ariane car elle ne reflète aucun sens.

Pour la plupart de nos fonctions de vue, la navigation est assez fixe et basée sur la conception de modèles / vues / URL. Dans nos cas, il y a beaucoup de plongées dans les détails, et les miettes de pain reflètent ce rétrécissement -- nous avons un "domaine", une "liste", un "parent" et un "enfant". Ils forment une hiérarchie simple du général au spécifique.

Dans la plupart des cas, une URL bien définie peut être facilement transformée en un joli fil d'ariane. En effet, c'est un test pour une bonne conception d'URL -- l'URL peut être interprétée comme des miettes de pain et affichée de manière significative pour les utilisateurs.

Pour quelques fonctions de vue, où nous présentons des informations qui font partie d'une jointure "plusieurs à plusieurs", par exemple, il y a deux parents potentiels. L'URL peut dire une chose, mais la pile de contexte de la session en dit une autre.

Pour cette raison, nos fonctions de vue doivent laisser des indices de contexte dans la session afin que nous puissions émettre des miettes de pain.

0 votes

Votre méthode semble être une variation plus complexe de la première méthode utilisant block.super que j'ai utilisée pour résoudre mon problème

5voto

minder Points 562

Essayez django-breadcrumbs - un middleware enfichable qui ajoute un itérable d'indications dans votre objet de demande.

Il prend en charge les vues simples, les vues génériques et l'application Django FlatPages.

5voto

Łukasz Mierzwa Points 91

J'ai eu le même problème et j'ai finalement créé une balise de modèle django simple pour cela : https://github.com/prymitive/bootstrap-breadcrumbs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X