Compare request.path con una URL invertida en la plantilla de Django

Entiendo que request.path me dará la URL actual.

Actualmente estoy trabajando en mi plantilla base.html con tabs CSS y quiero que la plantilla sepa qué pestaña está actualmente “activa” y pase class="active-tab" a una etiqueta .

Así que quería hacer algo como

 Orders 

Pero estoy seguro de que no puedes hacer eso if comparas. También quiero solo la URL base (?) Ignorando cualquier parámetro GET.

Cualquier sugerencia o consejos también son bienvenidos. ¡Gracias por adelantado!

Puede utilizar una etiqueta de plantilla personalizada

 from django import template register = template.Library() @register.simple_tag def active(request, pattern): path = request.path if path == pattern: return 'active' return '' 

Entonces el uso es algo así en tu plantilla:

 {% load my_tags %} {% url orders_list as orders %} 
  • Orders
  • Puede modificar la etiqueta de la plantilla como desee.

    Sobre la base de la respuesta de Josh, puedes usar una etiqueta simple ‘if’:

     {% url 'orders_list' as orders_list_url %} Orders 

    Una mejor versión de la respuesta principal sería revertir el nombre de vista:

     {% url_active 'reverse_viewname' %} 

    Esta versión no requiere que pase la request . En su lugar, indicamos que la etiqueta necesita el contexto y luego obtenemos la solicitud de eso.

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

    Inspirado por la respuesta del puma:

     $("ul.nav [href='"+window.location.pathname+"']").parents("li").addClass('active'); 

    Esta solución es simple JS, y funciona para la barra de navegación de Bootstrap. Para el escenario del OP se puede usar:

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

    Una solución con una opción if-then-else:

     from django import template from django.template.base import Node, NodeList, TemplateSyntaxError register = template.Library() class IfCurrentViewNode(Node): child_nodelists = ('nodelist_true', 'nodelist_false') def __init__(self, view_name, nodelist_true, nodelist_false): self.view_name = view_name self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false def __repr__(self): return "" def render(self, context): view_name = self.view_name.resolve(context, True) request = context['request'] if request.resolver_match.url_name == view_name: return self.nodelist_true.render(context) return self.nodelist_false.render(context) def do_ifcurrentview(parser, token): bits = token.split_contents() if len(bits) < 2: raise TemplateSyntaxError("'%s' takes at least one argument" " (path to a view)" % bits[0]) view_name = parser.compile_filter(bits[1]) nodelist_true = parser.parse(('else', 'endifcurrentview')) token = parser.next_token() if token.contents == 'else': nodelist_false = parser.parse(('endifcurrentview',)) parser.delete_first_token() else: nodelist_false = NodeList() return IfCurrentViewNode(view_name, nodelist_true, nodelist_false) @register.tag def ifcurrentview(parser, token): """ Outputs the contents of the block if the current view match the argument. Examples:: {% ifcurrentview 'path.to.some_view' %} ... {% endifcurrentview %} {% ifcurrentview 'path.to.some_view' %} ... {% else %} ... {% endifcurrentview %} """ return do_ifcurrentview(parser, token) 

    Puede calcular lo que necesite ( request.path = reverse('orders_list') por ejemplo) en su vista y pasar el resultado a la plantilla. En la vista (código de Python) puedes manipular la ruta tanto como quieras.

    Puede verificar si una URL es el prefijo de la otra.

    Prueba esta statement jQuery:

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

    Uso: {% url_active "home" "other-view" "and-so-on" success="active-specific-class" %}

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

    Descubrí una forma pirateada de hacerlo en jQuery … pero todavía estoy abierto a una mejor solución.

    jQuery:

     var tab_list = { 'orders-tab' : 'https://stackoverflow.com/questions/10263482/compare-request-path-with-a-reversed-url-in-django-template/{% url orders_list %}', 'users-tab' : 'https://stackoverflow.com/questions/10263482/compare-request-path-with-a-reversed-url-in-django-template/{% url users_list %}', 'vendors-tab': 'https://stackoverflow.com/questions/10263482/compare-request-path-with-a-reversed-url-in-django-template/{% url vendors_list %}', 'places-tab' : 'https://stackoverflow.com/questions/10263482/compare-request-path-with-a-reversed-url-in-django-template/{% url places_list %}' } $(document).ready(function() { for(var property in tab_list) { if('{{ request.path }}' == tab_list[property]) { $('#' + property).addClass('active-tab') break } } }) 

    HTML: