Djangoのルーティング層(B)とDNS名前空間を逆

URL名および逆引き

動的に対応するパス名に従って得

各経路からビュー関数名との対応関係を与えることができる
一意に対応する経路識別する名前
この名前は一意と重複しないことに注意を


シナリオ


別名フロントへのパス、またはバックエンドに通過することがエイリアスを通過しているので、利点は、より柔軟であり、限り修正されたソースパスとして、他の層を変更する必要がない、またはパスは、ソースから直接以上の結合度を通過した場合高い、柔軟性のない、メンテナンスコストが高すぎます


いいえグループ化する逆引きません

最初のステップ:命名


url(r'^pre/', views.press_list, name='press_list')


ステップ2:分析を逆転


ビューで

reverse('你给路由与视图函数对应关系起的别名')


from django.urls import reverse
reverse('press_list')           --->        '/pre/'


テンプレートを使用します

{% url '你给路由与视图函数对应关系起的别名' %}


{% url 'press_list' %}


不明なパケット逆引き


最初のステップ:命名


>>>> urls.py
url(r'^app01/', include('app01.urls'))

>>>> app01.urls.py
 url(r'^index/(\d+)/(\d+)/$', views.index, name='index')

>>>> app01.views.py
from django.shortcuts import render, redirect, HttpResponse

def index(request, year, month):
    # return HttpResponse(reverse('index', args=(year, month)))
    return render(request, 'home.html', locals())


ステップ2:分析を逆転


ビュー層で

`


from django.url import reverse
reverse('index', args=(year, month))        --->        /app01/index/2019/10/


テンプレートを使用します

{% url '你给路由与视图函数对应关系起的别名' %}


{% url 'index' 2019 10 %}


有名なグループ化の逆引き参照


最初のステップ:命名


>>>> urls.py
url(r'^app01/', include('app01.urls'))

>>>> app01.urls.py
url(r'^home/(?P<year>\d+)/(?P<month>\d+)/$', views.home, name='home')

>>>> app01.views.py
from django.shortcuts import render, redirect, HttpResponse

def home(request, year, month):
    # return HttpResponse(reverse('home', kwargs={'year': year, 'month': month}))
    return render(request, 'home.html', locals())


ステップ2:分析を逆転


ビュー層で


from django.url import reverse
reverse('home', kwargs={'year': year, 'month': month})  ---> /app01/home/2019/10


テンプレート層の用途で


{% url 'home' month=2019 year=10 %}


注意を払います

制服を採用するパケットフォーマットの逆引き参照有名な匿名のパケットのために

本質の逆解析:ビュー機能に対応した名前にアクセスできるように取得することです


名前空間

同じAPPは、異なるURL名を使用する場合でも、URL名前空間モードも唯一の名前のURLを逆にすることができます。

名前空間を使用しないでください、2つのアプリは、同じ名前の名前をルーティング表示され、それが一致する一致しますので、2つのアプリは異なっていない、同じページにアクセスするには

新しいアプリを作成します。

manage.py@dj4 > startapp app02

登録アプリ

settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app01.apps.App01Config',
    'app02.apps.App02Config',
]

ケース1

urls.py

from django.conf.urls import url, include


urlpatterns = [
    url(r'app01/',include('app01.urls')),
    url(r'app02/',include('app02.urls')),
]

app01.urls

from django.conf.urls import url
from app01 import views

urlpatterns = [
   url('^index/',views.index)
]

app01.views

def index(request):
    return HttpResponse('index1')

app02.urls`

from django.conf.urls import url
from app01 import views

urlpatterns = [
   url('^index/',views.index)
]

app02.views

def index(request):
    return HttpResponse('index2')

测试

http://127.0.0.1:8000/app01/index/を入力します。

http://127.0.0.1:8000/app02/index/を入力します。

2下のコンテンツのインデックスは、各アプリが彼または彼女自身のWebコンテンツにアクセスする必要があるが、ルート名を再度、および他のアプリで同じですが、この場合、これは、問題がある、アクセスにapp01のURLです名前空間によって解決


ケース2

名前空間を作成するには、2つのアプリ間でURLルーティングの関係

urls.py

from django.conf.urls import url, include

urlpatterns = [
    # 第一种写法
    # url(r'app01/', include("app01.urls", namespace="app01")),
    # url(r'app02/', include("app02.urls", namespace="app02")),
    
    # 第二种写法
    url(r'app01/', include(("app01.urls", "app01"))),
    url(r'app02/', include(("app02.urls", "app02"))),
]

app01.urls.py

from django.conf.urls import url
from app01 import views

urlpatterns = [
    url('^index/', views.index)
]

app02.urls.py

from django.conf.urls import url
from app02 import views

urlpatterns = [
   url('^index/',views.index)
]

app01.views.py

def index(request):
    return HttpResponse('index1')

app02.views.py

def index(request):
    return HttpResponse('index2')

おすすめ

転載: www.cnblogs.com/cjwnb/p/11790092.html