2015-10-07 4 views
8

背景

だが、私はジャンゴのビューに私をリンクするパラメータでURLパターンを持っているとしましょうURLを逆転するために必要なパラメータの名前を取得しますthingfeatureDjangoは

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は今、私は"thing_feature"という名前のURLを逆にするために、Djangoのreverse機能を提供する必要があるすべてのキーワードのリストです。

ご協力いただきましてありがとうございます。

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] 
+0

私はちょうどウサギの穴に落ちました:urlを逆にし、urlをurlパターンにマッチさせ、urlpatternの正規表現をコンパイルし、正規表現の 'groupindex'を調べてください。 – Monkpit

+1

問題は、必要なURLパラメータ名を知っている前にURLを元に戻すことができないということです。djangoは必要なkwargsがないため、 'reverse( 'thing_feature')'のエラーを発生させます。 –

+0

これを試すことができますhttp://stackoverflow.com/a/1275601私はここで自分自身を試し、代わりに '.items()'を使用して、kwargsを持つタプルの素敵なリストを返します。あなたはもっと深く進む必要があります。良いスタートがあるようですが、残念ながら私は今家に帰ります深くすることはできません。 – Tiago

答えて

2

私は公正な警告から始めましょう:これはパブリックAPIを使用できません。さらに、URLディスパッチャを1.10に書き直すように積極的に取り組んでいます。そのため、この方法はおそらくその時までに破損する可能性があります。

まず、RegexURLResolverを取得する必要があります。ビューは、名前空間に存在しない場合は、可能性のリストを取得し、kwargsからを抽出するためにreverse_dictを使用することができます。

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からの複数のパターンを持つことができますので、それを避けるために)、これは可能なkwargの各セットのリストを返します。通常、異なるセットは片側で必要なkwargsであり、もう片方側では必要な+ kwargsです。

私はこれをテストしていませんが、それがうまくいかない場合は正確な詳細を見つけるためにresolver.reverse_dictを掘ることができます。ユーザビリティを念頭に設計されたものではありませんでした。

+0

あなたは野蛮人です。あなたのコードは直接的にはうまく機能しませんが、機能的になるには十分な情報があります。私はまた、URLの正規表現が複数のkwargの仕組みになることを心配していません。最終的に何がうまくいったかを反映するために私の質問を更新しました –

+0

p.s.あなたがジャンゴの作家の一人であるように聞こえますか? –

+0

@GershomMaes私は貢献者ですが、コアチームの一員ではありません;) – knbk

0

あなたはドキュメントからresolve()

でこれを行うことができる必要があります:

次に、ResolverMatchオブジェクトを調べて、URL pに関する情報を提供することができますURLと一致するattern:あなたのコード例に

func, args, kwargs = resolve('/some/path/')

固有:

url = reverse('thing_feature') 
func, args, kwargs = resolve(url) 
# args == ['thing_name', 'feature_name'] 
+0

URLの名前を 'resolve'に渡すことはできません。 – ozgur

+0

あなたのコメントに基づいて@ozgurが更新されました。 –