django 多個app的urls.py 別名name重複問題

若多個app下的urls.py使用了重複相同的name, 前端需用此name生成的url會引起衝突
可用命名空間方法來區分相同name的url, 解決重複的問題

項目目錄結構

├── app1
│   │   urls.py
│   │   views.py
│   └── ...
│
├── app2
│   │   urls.py
│   │   views.py
│   └── ...
│   
├── django_test
│   │   settings.py
│   │   urls.py
│   └── ...
│   
└── templates
    └── home.html

django_test\settings.py

INSTALLED_APPS = [
	...
	# 添加APP
    'app1',
    'app2',
]
...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 修改 DIRS
        'DIRS': [os.path.join(BASE_DIR, 'templates')],
        'APP_DIRS': True,
        ...
    },
]

django_test\urls.py

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('app1/', include('app1.urls')),
    path('app2/', include('app2.urls')),
]

app1\urls.pyapp2\urls.py

from django.urls import path
from . import views

urlpatterns = [
    path('index', views.index, name='app'),
]

app1\views.pyapp2\views.py

from django.shortcuts import render

def index(request):
    return render(request, 'home.html')

templates\home.html (通常都會使用 {% url 'app' %} 來生成url, 方面修改)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home.html</title>
</head>
<body>
    <p>{% url 'app' %}</p>
</body>
</html>

訪問 127.0.0.1:8000/app1/index127.0.0.1:8000/app1/index 同樣返回 app2/index
由於 name 沒有作用域, django在反向解釋URL時, 會在項目全局順序搜索, 將查到的第一個 name 指定URL返回,所以反向解析得到的都是相同.


解決辦法

修改 app1\urls.pyapp2\urls.py 增加命名空間, 建議與APP目錄同名

from django.urls import path
from . import views

# 添加命名空間
app_name="app1"

urlpatterns = [
    path('index', views.index, name='app'),
]
from django.urls import path
from . import views

# 添加命名空間
app_name="app2"

urlpatterns = [
    path('index', views.index, name='app'),
]

templates\home.html 根據命名空間來生成url

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>home.html</title>
</head>
<body>
    <p>{% url 'app1:app' %}</p>
    <p>{% url 'app2:app' %}</p>
</body>
</html>





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章