2016-09-29 8 views
1

にロードされたときに、私はジャンゴのすべてのURLパターンに魔法を実行したい:彼らは名前を持っていない場合信号すべてのURLがジャンゴ

、その後、私は彼らに自動化された名前を与えたいです。

残念ながら、djangoはURLパターンを読み込みにくいようです。

このmagic-add-name-methodの実装は簡単であり、この質問の一部ではありません。

問題:このメソッドをどこから呼び出すのですか?私はすべてのURLがロードされた後、最初のリクエストが処理される前に、このメソッドを呼び出す必要があります。

コードは、Django 1.9とDjango 1.10で有効です。

背景

Djangoは、私は大規模なレガシーコードベースを持っている、と私は冗長な文字を入力し、維持するようにしませんDeprecate the ability to reverse by dotted path)

reverse('myapp.views.my_view') 

(このような輸入の文字列の使用は推奨しません。

名前のないすべてのURLに、対応するインポート文字列の名前を付けることを希望します。

urls.pの例y:

url(r'^.../.../(?P<pk>[^/]+)/$', views.my_view)) 

このURLの名前を自動的に 'myapp.views.my_view'に設定します。

私は事実の後に作成されたURLを変更するための信号を使用する代わりに、 django.conf.urls.urlの交換ラッパーの低下を書きません
+0

コードでこれらの名前を使用できない場合、URLパターンの名前を付けるポイントは何ですか? –

+0

@NilsWerner私は、私の背景を明らかにする質問を更新しました。 – guettli

答えて

1

def url(*args, **kwargs): 
    if 'name' not in kwargs: 
     kwargs['name'] = modulename(args[1]) # Returns something like 'polls.indexview' 

    return django.conf.urls.url(*args, **kwargs) 

あなたが

# from django.conf.urls import url # Removed to enable auto-naming 
from autonameroutes.urls import url 

from . import views 

app_name = 'polls' 
urlpatterns = [ 
    url(r'^$', views.IndexView.as_view(), name='index'), 
    url(r'^(?P<pk>\d+)/$', views.DetailView.as_view(), name='detail'), 
    ... 
] 

のように使用することができますロジックはシステム内のすべてのルートを変更するときと本質的に同じでなければなりませんが、使用するときにはより多くの制御が可能で、コードを後で維持している開発者にとっては明らかです。

+0

はい、これはうまくいく可能性があります。これを新しいコードに使用します。しかし、私は多くの検索+置換をしないで更新したい、大きな遺産コードベースを持っています。だから私はまだdjangoの最初の起動時にマッチングポイントにフックする方法を探しています。 – guettli

関連する問題