[英]Django - get names of parameters needed to reverse url
假設我有一個帶有參數的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]
我將從一個公平的警告開始:使用公共API不可能做到這一點。 最重要的是,我正在積極地為1.10重寫URL調度程序,因此該方法很可能會在那時中斷。
首先,您需要獲取正確的RegexURLResolver
。 如果視圖不在名稱空間中,則可以使用reverse_dict
獲取可能性列表,並提取kwarg:
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
由於視圖名稱可以具有多個具有不同kwarg的模式(盡管您出於自身的理智而希望避免使用該模式),因此這將返回每組可能的kwarg的列表。 通常,不同的集合在一側是必需的kwarg,在另一側是必需的+可選kwarg。
我還沒有測試過,但是如果它不起作用,您可以在resolver.reverse_dict
挖掘一下,以找出確切的細節。 在設計時並沒有考慮到可用性。
您應該可以通過resolve()
做到這一點
從文檔中:
然后可以查詢ResolverMatch對象以提供有關與URL匹配的URL模式的信息:
func, args, kwargs = resolve('/some/path/')
特定於您的示例代碼:
url = reverse('thing_feature')
func, args, kwargs = resolve(url)
# args == ['thing_name', 'feature_name']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.