簡體   English   中英

Django-獲取反向URL所需的參數名稱

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM