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>





  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值