Django URL 学习与Django URL name 详解

Django URL 学习与Django URL name 详解

路由系统概念
简而言之,路由系统就是路径和视图函数的一个对应关系。
django的路由系统作用就是使views里面处理数据的函数与请求的url建立映射关系。使请求到来之后,根据urls.py里的关系条目,去查找到与请求对应的处理方法,从而返回给客户
端http页面数据

img

路由系统的格式
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/ 可以看到

EAdU3T.jpg

我们计算加法的时候用的是 /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/

EALdkd.jpg

用在 views.pymodels.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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值