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:

如果在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规则。
2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理!
3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!