0
votes

Comment vérifier les itinéraires sur le modèle?

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 ?


1 commentaires

Vous passeriez généralement quelque chose dans le contexte de chaque vue que le modèle utiliserait pour modifier sa sortie


3 Réponses :


1
votes

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 ''


2 commentaires

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)



1
votes

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' %}


1 commentaires

Merci beaucoup! C'était précisément ce dont j'avais besoin.



0
votes

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


0 commentaires