Django框架对应的路由名称 Django框架路由系统中的正则匹配规则

鳄鱼君

发表文章数:531

Vieu四代商业主题

高扩展、安全、稳定、响应式布局多功能模板。

¥69 现在购买
首页 » Python教程 » Django框架对应的路由名称 Django框架路由系统中的正则匹配规则

Django的路由系统中有一下几种URL匹配规则:

from django.conf.urls import url
from django.contrib import admin
from myapp import views

1.url(r'^index/',views.index), FBV  url(r'^index/',views.Index.as_views()), CBV
2.url(r'^detail-(\d+).html/',views.detail),  匹配一个数值  detail(request,pid)
3.url(r'^detail-(?P<pid>\d+)-(?P<nid>\d+)',views.detail),  匹配多个数值  detail(request,pid,nid)
4.url(r'^detail-(?P<pid>\d+)-(?P<nid>\d+).....',views,detail), 匹配无数个
def detail(request,pid,nid,*args,**kwargs):
    pass  

detail(**kwargs)函数接收pid=,nid=,kid=…,detail(*args)函数接收(pid,nid,kid…),这是前面函数的关键字参数和可变参数,两者结合可传任意的参数。在path()中不支持正则匹配,需要使用re_path(),正则的写法跟url()一样。

接着前面的内容,我们想实现一个新的功能,在index页面可以查看键,点击对应的键就会进入对应的详情页面查看值,这个在前面已经实现过了,现在我想在index页面实现添加功能,需要在index.html中写一个表单:

<form action="/index/" method="post">
    <input type="username" name="user" placeholder="用户名">
    <input type="eamil" name="eamil" placeholder="邮箱">
    <input type="submit" value="添加">
</form>
<ul>
    {% for k,v in USER_DICT.items %}  {# 循环字典 i是key #}
    <li><a href="/detail-{{ k }}-{{ k }}.html" target="_blank" rel="noopener noreferrer">{{ k }}</a></li>
    {% endfor %}
</ul>

表单提交的URL还是index.html页面,就是用户看到的页面,那么现在想要修改这个页面的URL,需要修改两个地方,一个是路由规则中,还有一个是action提交的URL地址,非常的繁琐,django为我们提供了方便的方式:

re_path('index/',views.Index.as_view(),name='indexx') , #URL对应名字,在修改URL只需要修改前者

在form表单的action中只需要填写{% url 'indexx' %}即可,如果想要修改URL,修改路由规则中的URL就可以了,action还是{% url 'indexx' %},这样一来我们可以随意修改URL。

现在修改index的url为:indexdjiaojdsoaidj/(\d+),也就是:re_path(‘indexdjiaojdsoaidj/(\d+)/’,views.Index.as_view(),name=’indexx’),多了一个数值,那么在form表单中就需要修改为:action=”{% url ‘indexx’ 4 %}”,需要修改函数接受这个数值,不在啰嗦。我们运行代码,这里访问的就是:http://127.0.0.1:8000/indexdjiaojdsoaidj/1/,数值可以是任意的,我们可以看到不管访问的数值是多少,form表单中action的值永远都是固定的4:

Django框架对应的路由名称 Django框架路由系统中的正则匹配规则

如果在form的action中,我想要获取当前页面的URL,而不是固定的URl,可以使用request.path_info方法,这里的request是函数的参数,这里面包含了用户发来的所有信息,也包括的URL地址。那么只需要修改:action="{{ request.path_info }}就可以了,这样访问哪个页面,action就是哪个页面了,记得在函数中return。

两者各有用途,我们来对重点进行一下总结:

name: 对URL路由关系进行命名,以后可以根据此名称生成自己想要的URL
re_path('indexdjiaojdsoaidj/',views.Index.as_view(),name='indexx')
{% url 'indexx'  %}    所有的操作完成就会跳转的当前页面

re_path('indexdjiaojdsoaidj/(\d+)/',views.Index.as_view(),name='indexx')
{% url 'indexx' 4 %}  所有的操作完成就会跳转到固定页面 自定制操作

re_path('indexdjiaojdsoaidj/(\d+)/(\d+)/',views.Index.as_view(),name='indexx')
{% url 'indexx' 4 5 6 %} 多个数值空格分开

获取当前访问的URL
request.path_info
{{ request.path_info }}

在django中还有一种方法,就是根据name反转生成URL:

from django.urls import reverse
v=reverse('indexx') #re_path('indexdjiaojdsoaidj/',views.Index.as_view(),name='indexx')
print(v)  
k=reverse('indexx',args=(10,)) #re_path('indexdjiaojdsoaidj/(\d+)/',views.Index.as_view(),name='indexx')
print(k)  #打印indexdjiaojdsoaidj/10/  根据name生成URL
s=reverse('indexx',args=(10,20)) #re_path('indexdjiaojdsoaidj/(\d+)/(\d+)/',views.Index.as_view(),name='indexx')
print(s)  #打印indexdjiaojdsoaidj/10/20/  根据name生成URL

x=reverse('indexx',kwargs={'pid':2,'nid':99}) #re_path('indexdjiaojdsoaidj/(?P<pid>\d+)/(?P<nid>\d+)/',views.Index.as_view(),name='indexx')
print(x)  #打印indexdjiaojdsoaidj/2/99/

希望没有迷惑到大家,具体的用法就这么多,可以按照自己的想法构建想要的URL规则。

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Django框架对应的路由名称 Django框架路由系统中的正则匹配规则》 发布于2020-04-11

分享到:
赞(3) 赏杯咖啡

评论 抢沙发

6 + 7 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册