Django - 获取反转所需的参数名称 url
Django - get names of parameters needed to reverse url
背景
假设我有一个 url 模式,其参数将 link 我在 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 将我带到一个专门介绍特定事物的特定功能的页面。我可以这样做:
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"
.[=24= 的 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]
您应该可以使用 resolve()
来自文档:
A ResolverMatch object can then be interrogated to provide information about the URL pattern that matches a URL:
func, args, kwargs = resolve('/some/path/')
特定于您的示例代码:
url = reverse('thing_feature')
func, args, kwargs = resolve(url)
# args == ['thing_name', 'feature_name']
我将从一个公平的警告开始:使用 public API 是不可能的。最重要的是,我正在积极地为 1.10 重写 URL 调度程序,所以到那时这个方法很可能会中断。
首先,你需要获得正确的RegexURLResolver
。如果视图不在命名空间中,您可以使用 reverse_dict
获取可能性列表,并提取 kwargs:
def get_kwargs(view_name):
resolver = urlresolvers.get_resolver()
patterns = resolver.reverse_dict.getlist(view_name)
kwargs = []
for possibility, pattern, defaults in patterns:
for result, params in possibility:
kwargs.append(params)
return kwargs
由于一个视图名称可以有多个具有不同 kwargs 的模式(尽管为了您自己的理智,您希望避免这种情况),这将 return 列出每组可能的 kwargs。通常,不同的集合在一侧是必需的 kwargs,在另一侧是必需的 + 可选的 kwargs。
我还没有对此进行测试,但如果它不起作用,您可以在 resolver.reverse_dict
中挖掘一下以找出确切的细节。它的设计并没有完全考虑到可用性。
背景
假设我有一个 url 模式,其参数将 link 我在 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 将我带到一个专门介绍特定事物的特定功能的页面。我可以这样做:
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"
.[=24= 的 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]
您应该可以使用 resolve()
来自文档:
A ResolverMatch object can then be interrogated to provide information about the URL pattern that matches a URL:
func, args, kwargs = resolve('/some/path/')
特定于您的示例代码:
url = reverse('thing_feature')
func, args, kwargs = resolve(url)
# args == ['thing_name', 'feature_name']
我将从一个公平的警告开始:使用 public API 是不可能的。最重要的是,我正在积极地为 1.10 重写 URL 调度程序,所以到那时这个方法很可能会中断。
首先,你需要获得正确的RegexURLResolver
。如果视图不在命名空间中,您可以使用 reverse_dict
获取可能性列表,并提取 kwargs:
def get_kwargs(view_name):
resolver = urlresolvers.get_resolver()
patterns = resolver.reverse_dict.getlist(view_name)
kwargs = []
for possibility, pattern, defaults in patterns:
for result, params in possibility:
kwargs.append(params)
return kwargs
由于一个视图名称可以有多个具有不同 kwargs 的模式(尽管为了您自己的理智,您希望避免这种情况),这将 return 列出每组可能的 kwargs。通常,不同的集合在一侧是必需的 kwargs,在另一侧是必需的 + 可选的 kwargs。
我还没有对此进行测试,但如果它不起作用,您可以在 resolver.reverse_dict
中挖掘一下以找出确切的细节。它的设计并没有完全考虑到可用性。