Django URL 学习与Django URL name 详解
路由系统概念
简而言之,路由系统就是路径和视图函数的一个对应关系。
django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户
端http页面数据
路由系统的格式
url(正则表达式,view视图函数/视图类,参数)
def url(regex, view, kwargs=None, name=None):
url()函数可以传递4个参数,其中2个是必须的:regex和view,以及2个可选的参数:kwargs和name。下面是具体的解释:
-
regex:
regex是正则表达式的通用缩写,它是一种匹配字符串或url地址的语法。Django拿着用户请求的url地址,在urls.py文件中对urlpatterns列表中的每一项条目从头开始进行逐一对比, 一旦遇到匹配项,立即执行该条目映射的视图函数或二级路由,其后的条目将不再继续匹配。因此,url路由的编写顺序至关重要!
需要注意的是,regex不会去匹配GET或POST参数或域名,例如对于https://www.example.com/myapp/,regex只尝试匹配myapp/。对于https://www.example.com/myapp/?page=3,regex也只尝试匹配myapp/。
如果你想深入研究正则表达式,可以读一些相关的书籍或专论,但是在Django的实践中,你不需要多高深的正则表达式知识。
性能注释:正则表达式会进行预先编译当URLconf模块加载的时候,因此它的匹配搜索速度非常快,你通常感觉不到。
-
view:
当正则表达式匹配到某个条目时,自动将封装的HttpRequest对象作为第一个参数,正则表达式“捕获”到的值作为第二个参数,传递给该条目指定的视图。如果是简单捕获,那么捕获值将作 为一个位置参数进行传递,如果是命名捕获,那么将作为关键字参数进行传递。
-
kwargs:
任意数量的关键字参数可以作为一个字典传递给目标视图。
-
name:
对你的URL进行命名,可以让你能够在Django的任意处,尤其是模板内显式地引用它。相当于给URL取了个全局变量名,你只需要修改这个全局变量的值,在整个Django中引用它的地方也将 同样获得改变。这是极为古老、朴素和有用的设计思想,而且这种思想无处不在。
Django URL name 详解
首先,我们先看一下下面的一个urls.py的文件内容
from django.conf.urls import url
from django.contrib import admin
from learn import views as calc_views #将learn模块取一个别名calc_views
urlpatterns = [
url(r'^addshow/$',calc_views.index,name='home'),
url(r'^add/$', calc_views.add, name='add'), #方式一,如127.0.0.1/add 会调用calc_views模块下的add方法
url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), #方式二,如127.0.0.1/4/5会调用calc_views模块下的add2方法,带参数
]
name=‘add’ 是用来做什么的呢
简单来说,name 可以用于在 templates,models,views … 中得到对应的网址,相当于给网址取了个名字,只要这个名字不变,网址变了也能通过名字获取到。
首先我们先创建要创建learn模块,python manage.py startapp learn
将将 learn这个 app加入到 settings.py**
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'mainsite',
'product',
'showtv',
'learn',
]
修改learn/views.py
# coding=utf-8
from django.shortcuts import render
# Create your views here.
def index(request):
return render(request, 'home.html') #render函数 是渲染模板。
def add(request,i,j):
result=int(i)+int(j)
return render(request, "add.html", {"i": i, "j": j,"result":result})
def add2(request,i,j):
result=int(i)+int(j)
return render(request, "add.html", {"i": i, "j": j,"result":result})
在 learn 这个 app 中新建一个 templates 文件夹,在 templates 中新建一个 home.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Home</title>
</head>
<body>
<a href="/add/4/5/">计算 4+5</a>
</body>
</html>
修改 learn/urls.py
##此处省去前面一些代码
from learn import views as calc_views #将learn模块取一个别名calc_views
urlpatterns = [
url(r'^addshow/$',calc_views.index,name='home'), #调用learn模块的控制器views.py中的index方法,由于index方法中调用了return render(request, 'home.html'),即是调用了home.html来显示,其他的url配置以此类推
url(r'^add/(\d+)/(\d+)/$', calc_views.add2),
]
运行开发服务器,我们访问http://127.0.0.1:8001/addshow/ 可以看到
我们计算加法的时候用的是 /add/4/5/ ,后来需求发生变化,比如改成 /4_add_5/,但在网页中,代码中很多地方都写死的 /add/4/5/,比如模板中可能是这么写的
<a href="/add/4/5/">计算 4+5</a>
那么有没有更优雅的方式来解决这个问题呢?当然答案是肯定的
在网页模板中也是一样,可以很方便的使用。(关键一)
不带参数的:
{% url 'name' %}
带参数的:参数可以是变量名
{% url 'name' 参数 %}
修改上面的 learn/urls.py
##此处省去前面一些代码
from learn import views as calc_views #将learn模块取一个别名calc_views
urlpatterns = [
url(r'^addshow/$',calc_views.index,name='home'), #调用learn模块的控制器views.py中的index方法,由于index方法中调用了return render(request, 'home.html'),即是调用了home.html来显示,其他的url配置以此类推
url(r'^add/(\d+)/(\d+)/$', calc_views.add2, name='add2'), #name='add2'
]
例如:<a href="{% url 'add2' 4 5 %}">link</a>
这样就可以通过 {% url ‘add2’ 4 5 %} 获取到对应的网址 /add/4/5/
**当 urls.py 进行更改,前提是不改 name(这个参数设定好后不要轻易改),获取的网址也会动态地跟着变,**比如改成:
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
注意看重点 add 变成了 new_add,但是后面的 name=‘add2’ 没改,这时 {% url ‘add2’ 4 5 %} 就会渲染对应的网址成 /new_add/4/5/
用在 views.py 或 models.py 等地方的 reverse函数,同样会根据 name 对应的url获取到新的网址。
想要改网址的时候,修改 urls.py 中的正则表达式部分(url 参数第一部分),name 不变的前提下,其它地方都不需要修改。
文章参考于:
Django之URL(路由系统)用法
https://www.cnblogs.com/bypp/p/7992933.html
Django中文文档1.8
https://www.kancloud.cn/wizardforcel/django-chinese-docs-18/98883