前言: django命名空间解决什么问题?
- 在多个app之间,有可能产生同名的url,这个时候避免反转url的时候混淆,可以使用应用命名空间做区分。应用命名空间使用。在应用url中定义 app_name;
- 一个app,可以创建多个url映射到一个app中,所以就会产生一个问题,在做反转的时候,如果不使用命名空间,就会混淆,为了避免这个问题。我们可以使用实例命名空间。在include函数中添加namespace即可;
下面通过两个案例说明
一: 场景1,不同应用中的命名空间
(1)新建app应用
1 2 |
|
(2)主URL配置
1 2 3 4 5 6 7 8 9 |
|
(2)app01配置 project_django/app01/urls.py
1 2 3 4 5 6 7 |
|
(3)app01配置 project_django/app01/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
(4)app02配置 project_django/app02/urls.py
1 2 3 4 5 6 7 |
|
(5)app02配置 project_django/app02/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
我们可以看到每个app下面的urls都定义了name=index和name=login。 而每个views下面的reverse都是login。这个时候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
1 2 3 4 5 6 7 8 9 10 |
|
(2)app01配置 project_django/app01/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
(3)app02配置 project_django/app02/urls.py
1 2 3 4 5 6 7 8 9 |
|
(4)app02配置 project_django/app02/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
当我们浏览器打开路径: http://127.0.0.1:8000/app01 的时候,就会正常跳转地址: http://127.0.0.1:8000/app01/login 了
二: 场景2,同一个应用中的命名空间
先新启一个实例, #python manage.py startapp book
1. 我们先看一下代码案例,假设
(1)主URL,project_django/project_django/urls.py
1 2 3 4 5 6 7 8 9 |
|
多个url,指向同一个app。
(2)应用book的子URL,project_django/book/urls.py
1 2 3 4 5 6 7 |
|
(3)视图,project_django/book/views.py
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
通过上面案例,我们可以知道。
当执行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/login;访问/book2/的时候跳转/book2/login; 那么通一个应用中的两个实例,我们如何区分?
2. 案例修改
(1)主URL
1 2 3 4 5 6 7 8 9 |
|
(2)应用book的子URL
1 2 3 4 5 6 7 8 9 |
|
(3)视图
1 2 3 4 5 6 7 8 9 10 11 12 |
|
原文地址:https://www.cnblogs.com/shangping/p/11637999.html