用params测试字符串是否与django url匹配



我正在尝试创建一个模板,如果request.path url反转到一些命名的url,则返回' active'

这是我的模板代码

from django import template
from django.core.urlresolvers import reverse
import re
register = template.Library()
@register.simple_tag(takes_context=True)
def menu_main_active(context, urls):
    for url in urls.split():
        rev = reverse(url) #### PROBLEM IN THIS LINE ####
        if rev == context['request'].path or (re.search(rev.replace("/x/", "/?.+/"), context['request'].path) and rev != "/"):
            return ' active'
    return ''

它接受字符串的"列表"(以空格分隔),并检查其中是否有任何url的名称,该名称与request.path

中的当前url相反。

我是这样使用的

{% load menu_item %}
<li class="has-sub{% menu_main_active 'tape-listing tape-list-active tape-list-scratched tape-list-worm tape-detail' %}">

如果指定的url没有参数,效果会很好。

那么,我如何修改我的templatetag来处理有参数的url呢,比如这个
url(r'^tape/(?P<pk>w+)/$', views.TapeDetail.as_view(), name='tape-details'),

问题是

一行
rev = reverse(url)

不使用参数,不能这样做…并抛出这个异常:

NoReverseMatch at/qrf/tape/DRA100/未找到带参数"()"和关键字参数"{}"的"tape-detail"的反转。2模式(s)尝试:[u 'qrf/api/磁带/P (? [^/.]+)/.(? P [a-z0-9] +)的美元,u 'qrf/api/磁带/P (? [^/.]+)/$']

所以我正在寻找一种方法将url路径与url名称相匹配

您可以通过评估请求解析器匹配对象来大幅降低复杂性:

request.resolver_match.url_name  # 'tape-details'
request.resolver_match.view_name  # 'namespace:tape-details'

解决方案:

@register.simple_tag(takes_context=True)
def menu_main_active(context, urlnames):
    if context['request'].resolver_match.url_name in urlnames.split():
        return ' active'
    else:
        return ''

最新更新