8
votes

Comparez la demande.Path avec une URL inversée dans Django Modèle

Je comprends que request.path me donnera l'URL actuelle.

Je travaille actuellement sur mon base.html Modèle avec les onglets CSS et je veux le modèle pour savoir quel onglet est actuellement "actif" et passe class = "actif-onglet" à un tag.

donc je voulais faire quelque chose comme xxx

mais je suis sûr que vous ne pouvez pas faire ce si comparaison. Je veux aussi seulement que l'URL de base (?) Ignorer les paramètres d'obtention.

Toute suggestion ou astuces également les bienvenues. Merci d'avance!


0 commentaires

9 Réponses :


1
votes

Vous pouvez calculer tout ce dont vous avez besoin ( request.Path = inverse ('ordres_list') par exemple) à votre vue et transmettez le résultat au modèle. Dans la vue (code Python), vous pouvez manipuler le chemin autant que vous le souhaitez.

Vous pouvez vérifier si une URL est le préfixe de l'autre.


0 commentaires

0
votes

J'ai compris une façon piratée de le faire dans jQuery ... mais je suis toujours ouvert pour une meilleure solution.

jQuery: xxx

html: xxx


0 commentaires

2
votes

Vous pouvez utiliser un Tag de modèle personnalisé

{% load my_tags %}

{% url orders_list as orders %}
<li class="{% active request orders %}"> 
    <a href="{{ orders }}"> Orders </a> 
</li>


0 commentaires

1
votes

Essayez cette instruction JQuery:

$("[href='{{ request.path }}']").parents("li").addClass('active');


0 commentaires

2
votes

Inspiré de la réponse de Cougar:

$("[href='"+window.location.pathname+"']").addClass('active-tab');


0 commentaires

19
votes

Bâtiment sur la réponse de Josh, vous pouvez utiliser un simple "si" étiquette: xxx


1 commentaires

Je pense que cela devrait être la réponse acceptée car c'est le moyen le plus simple d'atteindre le résultat souhaité. Merci pour l'aide!



4
votes

Une meilleure version de la réponse supérieure serait d'inverser le nom de la vue: xxx pré>

Cette version ne nécessite pas de passer dans la demande code>. Au lieu de cela, nous indiquons que l'étiquette a besoin du contexte, puis obtenez la demande de celle-ci. P>

from django import template
from django.core.urlresolvers import reverse

register = template.Library()

@register.simple_tag(takes_context=True)
def url_active(context, viewname):
    request = context['request']
    current_path = request.path
    compare_path = reverse(viewname)
    if current_path == compare_path:
        return 'active'
    else:
        return ''


0 commentaires

1
votes

Utilisation: {% url_active "home" "autre vue" "and-SO-ON" SUCCESS = "CLASSE SPÉCIFIQUE ACTIVE"%} CODE>

from django import template

register = template.Library()


@register.simple_tag(takes_context=True)
def url_active(context, *args, **kwargs):
    if 'request' not in context:
        return ''

    request = context['request']
    if request.resolver_match.url_name in args:
        return kwargs['success'] if 'success' in kwargs else 'active'
    else:
        return ''


0 commentaires

2
votes

une solution avec une option if-then-else: xxx


2 commentaires

ton code fonctionne bien. Existe-t-il un moyen d'écrire un cas de test simple pour cela? Je veux conserver notre pourcentage de couverture de test. A écrit une question si question pour exactement cette demande à Stackoverflow.com/Questtions/47534145/...


Je suppose que c'est testable. Je ne sais pas comment. Vous devriez jeter un oeil à la façon dont Django teste ses balises (par exemple github.com/django/django/blob/... )