DjangoのAPP_NAMEの名前空間と名前空間

はじめに:Djangoの名前空間は、問題を解決しますか?

  1. 複数のアプリ間で、混乱のこの時間は、あなたが区別を行うアプリケーションの名前空間を使用することができたときには逆のURLを避けるために、同じ名前のURLを生成することが可能です。使用するアプリケーションの名前空間。アプリケーションURLで定義されてAPP_NAME

  2. アプリは、アプリ内にマッピングされた複数の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!!!!")

おすすめ

転載: blog.51cto.com/jiajinh/2432449