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

时间:2015-08-20 18:29:56

标签: python django django-templates django-views django-urls

如果' active'网址与某些已命名的网址相反,我正在尝试创建一个返回request.path的模板标签。

这是我的模板标签代码

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

它需要一个字符串“列表”(以空格分隔)并检查其中任何一个是否与request.path

中的当前网址相反的网址名称

这是我使用它的方式

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

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

那么,我如何修改我的模板标签以使用具有参数的网址,比如这个

url(r'^tape/(?P<pk>\w+)/$', views.TapeDetail.as_view(), name='tape-details'),

问题在于行

rev = reverse(url)

不使用params,也不能这样做......并抛出此异常:

  

/ qrf / tape / DRA100 /的NoReverseMatch   反向找到带有参数'()'和关键字参数'{}'的'tape-detail'。尝试了2种模式:[u'qrf / api / tapes /(?P [^ /。] +)/ \。(?P [a-z0-9] +)$',u'qrf / api /带/(ΔP[^ /。] +)/ $']

所以我正在寻找一种方法来匹配网址名称的网址路径。

1 个答案:

答案 0 :(得分:2)

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

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