Est-ce que quelqu'un sait comment vérifier si un modèle est accédé via une route URL avec le langage de modèle django?
Voici ma situation: il y a ce modèle article.html
, qui montre tous les articles d'un blog lorsqu'ils sont accédés via la route de l'URL du blog-home
, et qui affiche également uniquement les messages d'un utilisateur donné via la route de l'URL des user-posts
.
Ce modèle fonctionne comme ça, car ce qui définit les publications qui seront affichées, ce sont les classes dans views.py.
Cela étant dit, voici ce que j'ai essayé de faire: ( Je sais que c'est faux )
{% if url == 'user-posts' %} "Some HTML h1 tag I want do be shown only when this template is accessed via 'user-posts' url" {% endif %}
Comment serait la bonne façon, s'il y en a, d'écrire cette déclaration if ?
3 Réponses :
Vous devez créer une étiquette de modèle personnalisée ,
my_app / templatetags / utils.py
{% is_active_view 'front:blog-home' 'front:blog-categories' as display %}
Et utilisez-le dans votre modèle de cette façon, en supposant que blog-home
est le nom de l'url que vous avez donné à votre URL:
blog-home.html
{% load utils %} {% is_active_view 'blog-home' as display_blog_home_section %} {% if display_blog_home_section %} <!-- Your code --> {% endif %}
NB: cette balise de modèle peut vérifier après plusieurs noms de vue à la fois et prendre en charge les URL d'espacement de noms:
from django import template register = template.Library() @register.simple_tag(takes_context=True) def is_active_view(context, *view_names): request = context.get('request') for view_name in view_names: if getattr(request.resolver_match, 'view_name', False) and request.resolver_match.view_name == view_name: return True return ''
Merci beaucoup! Bien que ce ne soit pas une solution simple à mon cas d'utilisation, votre réponse sera très utile pour les autres fonctionnalités que je prévois de mon application.
Merci, j'ai modifié ma réponse pour vous donner un exemple encore plus complet (comme la vérification par rapport à plusieurs vues)
Lorsque Django correspond à un modèle d'URL, un objet ResolverMatch
est créé et mis à disposition sur l'objet de requête à request.resolver_match
. Cet objet ResolverMatch
peut être interrogé dans votre modèle pour obtenir ce que vous voulez, l'attribut url_name
est le nom du modèle d'url correspondant
{% if request.resolver_match.url_name == 'user-posts' %}
Merci beaucoup! C'était précisément ce dont j'avais besoin.
Voici une version plus optimisée de ceci si vous utilisez boostrap et essayez de rendre les options de menu "actives" lorsque vous êtes sur cette URL
<li class="nav-item {% is_active_tab 'games:list' %}"> <a class="nav-link" href="{% url 'games:list' %}"> {% translate "My Quizzes" %} </a> </li> <li class="nav-item {% is_active_tab 'games:create' %}"> <a class="nav-link" href="{% url 'games:create' %}"> {% translate "New Game" %} </a> </li>
Et vous l'utilisez comme
from django import template register = template.Library() @register.simple_tag(takes_context=True) def is_active_tab(context, *view_names): request = context.get('request') for view_name in view_names: if getattr(request.resolver_match, 'view_name', '') == view_name: return 'active' return ''
Il ajoute un nom de classe active
supplémentaire à la classe de l'élément si l'un des noms de vue correspond au nom de la vue actuelle. Rend l'écriture du modèle beaucoup plus propre
Vous passeriez généralement quelque chose dans le contexte de chaque vue que le modèle utiliserait pour modifier sa sortie