第二十七篇,Django编写URL规则

URL,统一资源定位系统(uniform resource locator;URL)是因特网的万维网服务程序上用于指定信息位置的表示方法。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738。互联网的每个文件都有它相对应的一个URL,指出文件的路径位置,URL也就是所谓的网站网址,在Django中,URL也称为URLconf。

URL编写规则

在每个App中新建一个urls.py项目结构如下:
在这里插入图片描述
注意是在之前创建好的项目名称,我这里的项目名称就是untitled3这个目录,可以在cmd终端用命令:django-admin startproject untitled3创建的项目,后面的项目名称可以自行命名。我之间就不小心在项目目录下创建urls.py导致打开浏览器的时候啥都没有显示,而现在这里的urls.py是在你创建项目的时候就会自动生成一个同名的文件夹,而这个urls.py会自动生成的。来编写根目录下urls.py编写url规则:

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('',include('index.urls'))
]

上述代码里面两个path就设定了两个URL地址,分别是Admin站点管理和首页地址,其中Admin站点管理是在创建项目时已经自动生成的,第二个path的意思是include将该URL分发给index的urls.py处理,当然我们新建的index下的urls.py也要修改:

from django.urls import path,re_path
from . import views
urlpatterns = [
path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
]

结构大致相同,上述path导入了同一目录下的views.py文件,该文件用于写视图函数,处理URL请求信息并返回网页内容给用户,所以这个时候我们又要编写views.py函数了:

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
    return HttpResponse("hello word")

index函数必须设置阐述request,表示当前用户的请求对象,包含用户名,请求内容和请求方式等信息,执行完成后要使用return来将结果返回,否则就会报错,启动项目在浏览器打开网页:http://127.0.0.1:8000/
在这里插入图片描述

带变量的URL

URL的变量类型有字符类型,整形,slug,uuid,大部分都是使用的字符类型与整形。
那我们修改一下index的urls.py里的函数:

from django.urls import path,re_path
from . import views
urlpatterns = [
    path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
    path('<str:year>/<int:month>/<slug:day>',views.mydate), #添加带有字符类型,整形,和slug的url。
]

在URL里使用变量符号<>可以为URL设置变量,在括号里面以冒号划分为两部分,前面的str,int,slug表示的是变量的数据类型,后面就是变量名,变量名可以自行命名。
之后在views.py中编写视图函数mydate的处理方法:

from django.shortcuts import render
from django.http import HttpResponse
def mydate(request,year,month,day):
    return HttpResponse(str(year) + '/'+ str(month) +'/'+ str(day))

mydate里面有4个函数参数,其中参数year,month,day来自URL的变量,URL的变量要与视图函数的参数一一对应,如果没有对应上就会报错,启动项目输入:http://127.0.0.1:8000/2019/12/03
在这里插入图片描述
在上述例子中,URL里的变量分别代表年月日。从变量的数据类型可以看出来,变量值只要符合数据格式都是合法的,使得某些变量不符合日期格式要求。也可以使用正则表达式,就得导入re_path模块:

from django.urls import path,re_path
from . import views
urlpatterns = [
    path('',views.index),#导入同一目录下的views.py文件,用于编写视图函数处理url信息并返回给网页内容给用户
    path('<str:year>/<int:month>/<slug:day>',views.mydate), #添加带有字符类型,整形,和slug的url。
    re_path('(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/(?P<day>[0-9]{2}).html',views.mydate) #使用了正则比上面书写规范点
]

设置参数name

除了在URL里面设置变量之外,Django还可以对URL进行命名,
在urls.py添加如下代码

from django.urls import path,re_path
re_path('(?P<year>[0-9]{4}).html',views.myyear,name='myyear')

在views.py添加如下代码

def myyear(request,year):
    return render(request,'1.html')

在之前创建好的templates文件夹中添加1.html文件

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<p>Hello word</p>
<div><a href="/2019.html">2019 old Archive</a> </div>
<div><a href="{%  url 'myyear' 2019 %}">2019 Archive</a> </div>
</body>
</html>

在这里插入图片描述
第一个标签a很好理解,就是一个地址,第二个标签a的href为{% url ‘myyear’ 2019 %},这是Django里面的模板语法,以{%%}表示,url ‘myyear’ 表示的是将命名为myyear的URL地址信息作为href属性值,2019是URL的变量year,如果没有设置变量值也不需要添加。myyear(request,year)这个里面的year是一个变量,因为在re_path里面设置了Pyear所以就需要在视图里添加year

注意了注意了

这里我之前遇到过一个问题就是运行打开浏览器是报错:‘set’ object is not reversible,这个错误的原因是因为我把项目中的urls.py文件里的urlpatterns列表的[ ]写成了{ },字典是无序的,所以报了不能逆转的错误,改为urlpatterns[ ]就可以了。
从以上例子可以看到模板的myyear与urls.py所设置的参数name是一一对应的,参数name的作用是对该URL地址信息进行命名,然后在HTML模板中使用可以生成相应的URL信息。里面有两种方法,第一种就是设置每个标签a的href属性值,如果URL地址发生改变,就要去修改每个标签a的href属性值,所以就有了第二种更为方便的方法,在URL设置参数name,只要参数name的值不变,无论URL地址如何变幻都不用修改标签a的href属性值。

设置额外参数

除了之前那个name='myyear‘设置参数之外,还可以使用字典的数据类型传递,没有具体命名,只要是字典形式就可以,设置而外参数必须是字典的形式表示,参数只能在视图函数读取和使用,一个键值对代表一个参数,参数值没有数据格式显示
index下的urls.py添加如下代码:

re_path('dict/(?P<year>[0-9]{4}).htm',views.myyear_dict,{'month':'12','day':'4'},name='myyear_dict')

index下的views.py添加代码如下:

def myyear_dict(request,year,month,day):
    return render(request,'2.html',{'month':month,'day':day})

templates下创建2.html添加代码如下:

<a href="{% url 'myyear_dict' 2019 %}">2019 {{month}}{{year}}Archive</a>

输出网址:http://127.0.0.1:8000/dict/2019.htm
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值