2013-10-04 14 views
24

私はDjangoのドキュメントを勉強していますが、私はどのような問題が解決しているのか分かりませんし、ドキュメントが私には分かりません。あなたが知っている人なら誰でも、本当の問題でネームスペースを使う方法の本当の例を教えてください。私は構文を知っているが、私はこれの目的を知らない。私は理解できなかった。ありがとうURLネームスペースの実際の例

答えて

30

通常、各アプリケーションのURLを独自の名前空間に入れるために使用されます。これにより、別のアプリでURLパターン名が一致したため、reverse() Django関数と{% url %}テンプレート関数が間違ったURLを返すのを防ぐことができます。

私は私のプロジェクトレベルurls.pyファイルを持っていることは以下の通りです:

from django.conf.urls.defaults import * 
from django.conf import settings 
from django.contrib import admin 
admin.autodiscover() 

urlpatterns = patterns('', 
    url(r'^$', 'main.views.main', name='main'), 
    url(r'^login$', 'django.contrib.auth.views.login', name="login"), 
    url(r'^logout$', 'django.contrib.auth.views.logout', 
     {"next_page": "/"}, name="logout"), 

# Admin 
    url(r'^admin/doc/', include('django.contrib.admindocs.urls')), 
    url(r'^admin/', include(admin.site.urls)), 
) 

# Auto-add the applications. 
for app in settings.LOCAL_APPS: 
    urlpatterns += patterns('', 
     url(r'^{0}/'.format(app), include(app + '.urls', namespace=app)), 
    ) 

注最後のセクション:これは私がインストールされているアプリケーションを通過(settings.LOCAL_APPSは、私はそれが唯一の私のアプリケーションが含まれている追加の設定ですそれはINSTALLED_APPSに追加され、南のようなものがあります)、それぞれの中でurls.pyを探して、それらのURLをアプリの後に名前をつけた名前空間にインポートし、それらのURLをアプリの名前を付けたURLサブディレクトリに入れます。

私はhostsという名前のアプリを持っている、とhosts/urls.pyがどのように見えるのであれば、例えば、:

from django.conf.urls.defaults import * 

urlpatterns = patterns('hosts.views', 
    url(r'^$', 'show_hosts', name='list'), 
) 

今私のviews.pyhosts.views.show_hostsを呼び出すページへのURLを取得するためにreverse("hosts:list")を呼び出すことができ、それが見えます"/hosts/"のようなものです。同じテンプレート内の{% url "hosts:list" %}になります。こうすることで、別のアプリで「リスト」というURLとの衝突を心配する必要がなくなり、すべての名前にhosts_の接頭辞を付ける必要はありません。

ログインページは、名前空間が指定されていないため、{% url "login" %}にあることに注意してください。また、あなたはジャンゴ・RestFrameworkのようなサードパーティのアプリを使用している考えてみましょう
url(r'^login/',include('app_name', name='login'))

以下のよう

+2

を使用して逆転させることができる..しかし、これは右、URLに名前を入れと同じですか?同じ仕事をしてください.. –

+1

今私は完全な答えを見ました...そしてそれは素晴らしいです...私が正しいと思ったら、名前空間と一緒に名前空間を使用します。同じ名前の異なるアプリケーションから2つのビューに名前を付けた場合、心配することはありません...これは正しいですか? –

+1

かなり。私は他の用途、より良いものがあると確信していますが、これは簡単な例でした。 –

0

を使用すると、URLパターンを使用しています考えてみましょう。 アプリケーションを使用するときは、プロジェクトのURL confファイルに次の行を宣言する必要があります。あなたは残りのフレームワークのコードをチェックすると

url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')) 

さて、あなたは私たちが私たちの中にURLパターンの名前のログイン 'を使用している

urlpatterns = [ 
    url(r'^login/$', login, login_kwargs, name='login'), 
    url(r'^logout/$', logout, name='logout'), 
] 

urls.pyファイルに以下のコードを見つけますそのURLパターンの1つとしてDjango-rest-frameworkが同じ名前を使用しています。 reverse( 'login')を使うと、Djangoは混乱します。
これらの問題を解決するために、私たちは名前空間を使用します。

@register.simple_tag 
def optional_docs_login(request): 
    """ 
    Include a login snippet if REST framework's login view is in the URLconf. 
    """ 
    try: 
     login_url = reverse('rest_framework:login') 
    except NoReverseMatch: 
     return 'log in' 

名前空間のURL名は、他の名前空間と決して衝突しません。
名前空間URLパターンは、私が見
reverse('namespace:url_name')

関連する問題