【发布时间】:2016-01-05 06:59:28
【问题描述】:
背景
假设我有一个带有参数的 url 模式,可以将我链接到 django 中的视图:
url(
r'^things/(?P<thing_name>\w+)/features/(?P<feature_name>\w+)$',
views.thingFeature,
name='thing_feature'
),
假设我有一个thing 和一个feature:
thing = Thing.objects.get(.....)
feature = thing.feature_set.first()
t_name = thing.name
f_name = feature.name
现在 Django 为我提供了获取 url 的强大功能,该 url 将我带到专门用于特定事物的特定功能的页面。我可以这样做:
from django.core.urlresolvers import reverse
url = reverse('thing_feature', thing_name=t_name, feature_name=f_name)
# url == '/things/thing2/features/left-arm'
问题
现在我偶然发现了一种需要专门解决的情况。我不是在寻找解决方法 - 我正在寻找解决以下问题:
给定一个 url 的 name,我如何获得反转该 url 所需的 kwarg 参数名称列表?
我正在寻找函数get_kwarg_names_for_url。它的行为是这样的:
url_kwarg_names = get_kwarg_names_for_url('thing_feature')
# url_kwarg_names == ['thing_name', 'feature_name']
url_kwarg_names 现在是我需要提供给 Django 的 reverse 函数以反转名为 "thing_feature" 的 URL 的每个关键字的列表。
感谢任何帮助!
解决方案
根据 knbk 的回答,我想出了以下解决方案:
def get_kwarg_names_for_url(url_name):
resolver = get_resolver(get_urlconf())
reverse_data = resolver.reverse_dict[url_name]
pattern_list = reverse_data[0]
'''
Need to specify the 1st pattern because url regexes can
potentially have multiple kwarg arrangments - this function does
not take this possibility into account.
'''
first_pattern = pattern_list[0]
'''
`first_pattern` is now of the form `(url_string, kwarg_list)` -
all we are interested in is the 2nd value.
'''
return first_pattern[1]
【问题讨论】:
-
我刚刚陷入了以下困境:反转 url,将 url 与 urlpattern 匹配,编译 urlpattern 正则表达式,并检查正则表达式的
groupindex... 我必须这里缺少一些东西。 -
一个问题是,在您已经知道所需的 url 参数名称之前,您无法反转 url - django 将为
reverse('thing_feature')引发错误,因为它缺少所需的 kwargs! -
你可以试试这个stackoverflow.com/a/1275601 我在这里试过了,用
.items()代替,它会返回一个很好的包含kwargs 的元组列表。你必须更深入 github.com/django/django/blob/stable/1.8.x/django/core/…> 似乎是一个好的开始,不幸的是我现在要回家了,不能再深入了。 -
我只想补充一点,您不需要 kwarg 名称本身来反转模式。甚至具有命名组的模式也接受位置参数。
标签: python django django-urls