Django中url的反向查询的方法


Posted in Python onMarch 14, 2018

本文介绍了Django中url的反向查询的方法,分享给大家,具体如下:

明确几个概念:

1、application namespace :

正在部署的app的名称,一个app的多个实例应该具有相同的application namespace.

可以通过在URLconf模块(urls.py)中设置 app_name 属性(与urlpatterns属性同级)来指定application namesapce.
(在django2.0版本中必须设置 app_name )

2、instance namespace :

表示app的一个特定的实例.它在当前项目中应该是唯一的.一个app可以有多个实例!

3、默认实例(default instance of application) :

instace namesapce与所属app的application namespace相同的实例

4、当前实例 :

使用 reverse() 函数的 current_app 参数可以指定当前应用.

当要反向解析一个namespace URL(例如'polls:index')的时候,Django将切分名称为多个部分,然后按下面的步骤查找:

Django中url的反向查询的方法

通过django文档中的一个示例来说明,考虑polls应用有俩个实例'publisher-polls'和'author-polls':

#urls.py
from django.conf.urls import include, url

urlpatterns = [
  url(r'^author-polls/', include('polls.urls', namespace='author-polls')),
  url(r'^publisher-polls/', include('polls.urls', namespace='publisher-polls')),
]
from django.urls import path

from . import views

app_name = 'polls'
urlpatterns = [
  path('', views.IndexView.as_view(), name='index'),
  path('<int:pk>/', views.DetailView.as_view(), name='detail'),
  ...
]

根据以上设置,可以使用下面的查询:

此时'polls:index'的namespace与当前app的application instance(及app_name)相匹配.如果其中一个实例是当前应用实例(current),例如正在渲染'author-polls'的detail视图,'polls:index'将解析到'author-polls'实例的index页面.下面的两种方式的结果都是'/author-polls/'

在类视图中:

reverse('polls:index', current_app=self.request.resolver_match.namespace)

在模板中: {% url 'polls:index' %}

如果没有当前实例(current),例如在站点的其它地方渲染一个页面.'polls:index'将解析到 polls 中最后一个注册的实例中.因为没有默认实例(instance namespace为'polls'的实例),将使用 polls 注册的最后一个实例.在这里将解析到'publisher-polls',因为它在 urlpatterns 的末尾.

如果解析'author-polls:index',将直接定位到'author-polls'的index页面.因为此时的namesapce是'author-polls',不能与application namespace匹配,根据上面的流程将直接查找instance namespace.

如果上面的app还有一个名为'polls'的默认实例,上面的第二种情况'polls:index'将解析到该默认实例,而不是 urlpatterns 中最后声明的实例.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python从入门到精通(DAY 2)
Dec 20 Python
对Python中for复合语句的使用示例讲解
Nov 01 Python
python实现n个数中选出m个数的方法
Nov 13 Python
Python语言快速上手学习方法
Dec 14 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
Feb 07 Python
PyCharm2019安装教程及其使用(图文教程)
Sep 29 Python
python sklearn常用分类算法模型的调用
Oct 16 Python
Python3+Selenium+Chrome实现自动填写WPS表单
Feb 12 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
Python count函数使用方法实例解析
Mar 23 Python
详解用Python爬虫获取百度企业信用中企业基本信息
Jul 02 Python
Python 虚拟环境工作原理解析
Dec 24 Python
python ddt实现数据驱动
Mar 14 #Python
Python使用Django实现博客系统完整版
Sep 29 #Python
Python学生信息管理系统修改版
Mar 13 #Python
python之pandas用法大全
Mar 13 #Python
python使用sqlite3时游标使用方法
Mar 13 #Python
Python打印输出数组中全部元素
Mar 13 #Python
python实现学生信息管理系统
Apr 05 #Python
You might like
香妃
2021/03/03 冲泡冲煮
基于PHP文件操作的详解
2013/06/05 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
PHP Laravel中的Trait使用方法
2019/01/20 PHP
Yii框架Session与Cookie使用方法示例
2019/10/14 PHP
谷歌浏览器 insertCell与appendChild的区别
2009/02/12 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
jquery easyui combox一些实用的小方法
2013/12/25 Javascript
使用jquery实现的一个图片延迟加载插件(含图片延迟加载原理)
2014/06/05 Javascript
js实现的标题栏新消息闪烁提示效果
2014/06/06 Javascript
javascript在网页中实现读取剪贴板粘贴截图功能
2014/06/07 Javascript
IE6-IE9使用JSON、table.innerHTML所引发的问题
2015/12/22 Javascript
微信小程序 使用腾讯地图SDK详解及实现步骤
2017/02/28 Javascript
node+express+ejs使用模版引擎做的一个示例demo
2017/09/18 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
Vue.js 时间转换代码及时间戳转时间字符串
2018/10/16 Javascript
微信小程序实现留言板(Storage)
2018/11/02 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
[00:43]DOTA2小紫本全民票选福利PA至宝全方位展示
2014/11/25 DOTA
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
Python 匹配任意字符(包括换行符)的正则表达式写法
2009/10/29 Python
python实现DES加密解密方法实例详解
2015/06/30 Python
Python multiprocessing多进程原理与应用示例
2019/02/28 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
Python3.7下安装pyqt5的方法步骤(图文)
2020/05/12 Python
python新手学习使用库
2020/06/11 Python
Python调用ffmpeg开源视频处理库,批量处理视频
2020/11/16 Python
python try...finally...的实现方法
2020/11/25 Python
大学新生军训个人的自我评价
2013/10/03 职场文书
工作失误检讨书(经典集锦版)
2014/10/17 职场文书
2015年五四青年节活动总结
2015/02/10 职场文书
祝寿主持词
2015/07/02 职场文书
Golang 使用Map实现去重与set的功能操作
2021/04/29 Golang