若多个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.py
与 app2\urls.py
from django.urls import path
from . import views
urlpatterns = [
path('index', views.index, name='app'),
]
app1\views.py
与 app2\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/index
与 127.0.0.1:8000/app1/index
同样返回 app2/index
由于 name
没有作用域, django在反向解释URL时, 会在项目全局顺序搜索, 将查到的第一个 name
指定URL返回,所以反向解析得到的都是相同.
解决办法
修改 app1\urls.py
与 app2\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>