测试字符串是不是与带有参数的 django url 匹配

Posted

技术标签:

【中文标题】测试字符串是不是与带有参数的 django url 匹配【英文标题】:Test if string matches django url with params测试字符串是否与带有参数的 django url 匹配 【发布时间】:2015-11-14 12:54:01 【问题描述】:

我正在尝试创建一个模板标签,如果 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没有参数,效果很好。

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

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

问题在于这条线

rev = reverse(url)

不使用params,做不到……并抛出这个异常:

NoReverseMatch 在 /qrf/tape/DRA100/ 未找到带有参数“()”和关键字参数“”的“磁带详细信息”的反向。尝试了 2 种模式:[u'qrf/api/tapes/(?P[^/.]+)/\.(?P[a-z0-9]+)$', u'qrf/api/磁带/(?P[^/.]+)/$']

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

【问题讨论】:

你能发布一个来自urls.split()的样本url ['tape-listing', 'tape-list-active', 'tape-list-scratched', 'tape-list-worm', 'tape-detail'] 【参考方案1】:

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

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

【讨论】:

以上是关于测试字符串是不是与带有参数的 django url 匹配的主要内容,如果未能解决你的问题,请参考以下文章

带有查询参数的 APITest 与普通 url 不同吗?

带有参数的 Django 反向 url 到基于类的视图

如何从 Django 中的 GET 参数创建漂亮的 url?

如何在 url 上使用带有参数的 Spyne+Django?

带有查询参数的 Django url 模板

Django : HTML 表单操作指向带有 2 个参数的视图(或 url?)