はじめに:Djangoの名前空間は、問題を解決しますか?
-
複数のアプリ間で、混乱のこの時間は、あなたが区別を行うアプリケーションの名前空間を使用することができたときには逆のURLを避けるために、同じ名前のURLを生成することが可能です。使用するアプリケーションの名前空間。アプリケーションURLで定義されてAPP_NAME
- アプリは、アプリ内にマッピングされた複数のURLを作成することができますので、問題が生じ、逆を行う際には、名前空間は、この問題を回避するためには、混同されます使用している場合。私たちは、名前空間の例を使用することができます。機能に含める名前空間を追加します。
次の2つの場合は、説明します
ワン:シーン1、異なるアプリケーションの名前空間
(1)新しいアプリの適用を
#python manage.py startapp app01
#python manage.py startapp app02
(2)メイン設定URL
from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('app01/', include('app01.urls')),
path('app02/', include('app02.urls')),
]
(2)app01が配置project_django / app01 / urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
(3)app01が配置project_django / app01 / views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse
# Create your views here.
def index(request):
if request.GET.get("username"):
return HttpResponse("front page app01!")
else:
return redirect(reverse("login"))
def login(request):
return HttpResponse("Login page app01!")
(4)app02が配置project_django / app02 / urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
(5)app02が配置project_django / app02 / views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse
# Create your views here.
def index(request):
if request.GET.get("username"):
return HttpResponse("front page app02!")
else:
return redirect(reverse("login"))
def login(request):
return HttpResponse("Login page app02!")
私たちは、それぞれのアプリは以下のURL名=インデックスと名前=ログインを定義して見ることができます。次のビューのそれぞれの逆はログインされています。この時間は戻って探しに行くDjangoの?我々はブラウザのパス開くとき:http://127.0.0.1:8000/app01を:、私たちも、アドレスにジャンプ、ジャンプ異常を見つけるでしょうhttp://127.0.0.1:8000/app02/login以上。
私たちは、名前空間のAPP_NAMEを使用する今回は、この問題に良い解決策になることができ。
設定を変更
(1)app01が配置project_django / app01 / urls.py
from django.urls import path
from . import views
#命名空间
app_name = 'app01' #这里变化了
urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
(2)app01が配置project_django / app01 / views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect,reverse
# Create your views here.
def index(request):
if request.GET.get("username"):
return HttpResponse("front page app01!")
else:
return redirect(reverse("app01:login")) #这里变化了
def login(request):
return HttpResponse("Login page app01!")
(3)app02が配置project_django / app02 / urls.py
from django.urls import path
from . import views
app_name = 'app02' #这里变化了
urlpatterns = [
path('', views.index,name='index'),
path('login', views.login,name='login'),
]
(4)app02が配置project_django / app02 / views.py
from django.http import HttpResponse
from django.shortcuts import render
from django.shortcuts import redirect, reverse
# Create your views here.
def index(request):
if request.GET.get("username"):
return HttpResponse("front page app02!")
else:
return redirect(reverse("app02:login")) #这里变化了
def login(request):
return HttpResponse("Login page app02!")
私たちは、ブラウザのパス開くとき:http://127.0.0.1:8000/app01をし、それが通常のアドレスにジャンプします。http://127.0.0.1:8000/app01/login
II:シーン2、同じアプリケーションの名前空間
まずmanage.py startappのブック#python、新しいインスタンスを起動します
1.私たちは、と仮定して、コードでそのケースを見て
(1)主URL、project_django / project_django / urls.py
from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('book1/', include('book.urls')),
path('book2/', include('book.urls')),
]
複数のURL、同じアプリをポイントします。
息子URL書籍の(2)アプリケーション、project_django /書籍/ urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.book_list),
path('login', views.book_login, name="login"),
]
(3)ビュー、project_django /書籍/ views.py
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
from django.shortcuts import redirect,reverse
def book_list(request):
if request.GET.get("username"):
return HttpResponse("My book list !!!!")
else:
return redirect(reverse("login"))
def book_login(request):
return HttpResponse("Please Login!!!!")
上記のケースを通じて、我々は知ることができます。
実行するとhttp://127.0.0.1:8000/book2/はhttp://127.0.0.1:8000/book2/loginをジャンプします
それはhttp://127.0.0.1:8000/book1/を行うことが判明したときまたはhttp://127.0.0.1:8000/book2/loginジャンプ
これは、私たちが/ BOOK1 /ログイン/ BOOK1 /時間のジャンプにアクセスしたい、私たちが望む結果ではありません。アクセス/ BOOK2 /時間ジャンプ/ BOOK2 /ログイン;その後、どのように我々は区別しない、アプリケーションの2つのインスタンスを渡しますか?
2. [変更ケース
(1)主URL
from django.contrib import admin
from django.conf.urls import url, include
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('book1/', include('book.urls'), namespace='book1')), #变更部分
path('book2/', include('book.urls'), namespace='book2')), #变更部分
]
書籍の息子URLは、(2)アプリケーション
from django.urls import path
from . import views
app_name = "book"
urlpatterns = [
path('', views.book_list),
path('login', views.book_login, name="login"),
]
(3)閲覧
def book_list(request):
#获取当前namespace名称。
current_namespace = request.resolver_match.namespace #变更部分
if request.GET.get("username"):
return HttpResponse("My book list !!!!")
else:
print(current_namespace)
#动态返回命名空间信息
return redirect(reverse("%s:login"% current_namespace)) #变更部分
def book_login(request):
return HttpResponse("Please Login!!!!")