测试字符串是否与带有参数的 django url 匹配
Test if string matches django url with params
我正在尝试创建一个模板标签,如果 request.path
url 反转为某些名为 url 的 returns ' 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 ''
它接受 "list" 个字符串(由 space 分隔)并检查其中是否有一个 url 的名称反转为当前 url在 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 没有参数,它会很好用。
那么,我如何修改我的模板标签以使用具有参数的 urls,就像这个
url(r'^tape/(?P<pk>\w+)/$', views.TapeDetail.as_view(), name='tape-details'),
问题是行
rev = reverse(url)
不使用参数,也做不到...并抛出此异常:
NoReverseMatch at /qrf/tape/DRA100/
Reverse for 'tape-detail' with arguments '()' and keyword arguments '{}' not found. 2 pattern(s) tried: [u'qrf/api/tapes/(?P[^/.]+)/\.(?P[a-z0-9]+)$', u'qrf/api/tapes/(?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 ''
我正在尝试创建一个模板标签,如果 request.path
url 反转为某些名为 url 的 returns ' 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 ''
它接受 "list" 个字符串(由 space 分隔)并检查其中是否有一个 url 的名称反转为当前 url在 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 没有参数,它会很好用。
那么,我如何修改我的模板标签以使用具有参数的 urls,就像这个
url(r'^tape/(?P<pk>\w+)/$', views.TapeDetail.as_view(), name='tape-details'),
问题是行
rev = reverse(url)
不使用参数,也做不到...并抛出此异常:
NoReverseMatch at /qrf/tape/DRA100/ Reverse for 'tape-detail' with arguments '()' and keyword arguments '{}' not found. 2 pattern(s) tried: [u'qrf/api/tapes/(?P[^/.]+)/\.(?P[a-z0-9]+)$', u'qrf/api/tapes/(?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 ''