命名URL和URL反向解析

前言

起始样式,HTML中的href是写死的,不能更改,如下示例代码:

# urls中
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/$', views.JJzz.as_view()),
url(r'^jjzz_index/$', views.Index.as_view()),
url(r'^jjzz_visit/$', views.Visit.as_view(),name='jz'),
] # views中
class Visit(View):
jjzz = 'jjzz on the world'
def get(self, request,**kwargs):
# return JsonResponse({'jjzz': self.jjzz})
return render(request,"jjzz_visit.html") class Index(View):
jjzz = 'jjzz on the world'
def get(self, request,**kwargs):
# return JsonResponse({'jjzz': self.jjzz})
return render(request,"jjzz.html") class JJzz(View):
def get(self, request):
return redirect("/jjzz_index/") # HTML模板中
<body>
<a href="/jjzz/">欢迎来到叽叽喳喳的世界</a>
</body>

​ 为了解决这种不灵活的情况,Django提供了一种可以自动更新URL而不用手动遍历项目的源代码来搜索并替换对应的URL。可以通过URL的匹配规则起一个名字,一个URL匹配,模式起对应一个名字。

常规URL情况下

第一步:静态路由命名

# urls中
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/$', views.JJzz.as_view()),
url(r'^jjzz_index/$', views.Index.as_view(),name='jjz'),
url(r'^jjzz_visit/$', views.Visit.as_view()),
]

第二步:reverse反向解析

# views中修改
# 导入reverse功能
from django.urls import reverse
或者 from django.shortcuts import reverse,两个是同一个reverse
class JJzz(View):
def get(self, request):
return redirect(reverse('jjz'))
# 或者return redirect('jjz') # HTML模板中
<body>
<a href="{% url "jjz" %}">欢迎来到叽叽喳喳的世界</a>
</body> 【总结】只要name不变,前边的正则匹配怎么变都没有关系

分组情况下

第一步:静态路由命名

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/$', views.JJzz.as_view()),
url(r'^jjzz_index/([0-9]{4})/$', views.Index.as_view(),name='jjz'),
url(r'^jjzz_visit/$', views.Visit.as_view()),
]

第二步:reverse反向解析

# views中
# 导入reverse功能
from django.urls import reverse
class JJzz(View):
def get(self, request,*args):
return redirect(reverse('jjz',args=("2019",))) # HTML模板中
<body>
<a href="{% url "jjzz" '2019'%}">欢迎来到叽叽喳喳的世界</a>
</body> # 其中
reverse('jjzz',args=("2019",) —— 》 /jjzz_index/2019/
{% url ‘jjzz’ '2019' %} —— 》 /jjzz_index/2019/

【总结】

  1. 利用args传参时要用元组或者列表将参数包括起来
  2. 在模板中添加参数时,要用字符串的形式

命名分组情况下

第一步:静态路由命名

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^jjzz/$', views.JJzz.as_view()),
url(r'^jjzz_index/(?P<year>[0-9]{4})/$', views.Index.as_view(),name='jjz'),
url(r'^jjzz_visit/$', views.Visit.as_view()),
]

第二步:reverse反向解析

# views中
# 导入reverse功能 from django.urls import reverse
class JJzz(View):
def get(self, request,**kwargs):
return redirect(reverse('jjz',kwargs={"year":'2019'}))
# 或者 return redirect(reverse('jjz',args=("2019",))) # HTML文件中
<body>
<a href="{% url "jjz" year='2019' %}">欢迎来到叽叽喳喳的世界</a>
<a href="{% url "jjz" '2019' %}">欢迎来到叽叽喳喳的世界</a>
</body # 其中
reverse('jjz',kwargs={"year":'2019'}) --》 /jjzz_index/2019/
{% url "jjz" year='2019' %} --》 /jzzz_index/2019/

命名空间模式

​ 不同的app中使用相同的URL命名时,使用URL的命名空间模式namespace可以定义唯一反转命名的URL。

【示例】

# 主urls中
from django.conf.urls import url, include urlpatterns = [
url(r'^app01/', include('app01.urls', namespace='app01')),
url(r'^app02/', include('app02.urls', namespace='app02')),
]
# app01的urls中
from django.conf.urls import url
from app01 import views app_name = 'app01'
urlpatterns = [
url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]
# app02的urls中
from django.conf.urls import url
from app02 import views app_name = 'app02'
urlpatterns = [
url(r'^(?P<pk>\d+)/$', views.detail, name='detail')
]

虽然上述两个app中url名称重复了,但是反转URL的时候可以通过命名空间的名称得到对应的URL。

语法:

'命名空间名称:URL名称'

 # 模板中使用:

{% url 'app01:detail' pk=12 pp=99 %}

 # views中的函数中使用

v = reverse('app01:detail', kwargs={'pk':11})

这样即使app中URL的命名相同,我们也可以反向解析得到正确的URL。

Django路由系统-URL命名&URL反向解析的更多相关文章

  1. Django路由系统-分组命名匹配

    Django路由系统 分组命名匹配 ​ 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/( ...

  2. Django之url上的include,URL命名和反向解析,命名空间

    include其他的URLconfs   #At any point, your urlpatterns can “include” other URLconf modules. This #esse ...

  3. Django-静态文件导入/url命名及反向解析

    一.静态文件导入 js.css.img等都叫做静态文件,那么关于django中静态文件的配置,我们就需要在settings配置文件里面写上这写内容: # STATIC_URL = '/xxx/' #别 ...

  4. url的命名与反向解析

    url命名和反向解析  1. 命名   # url(r'^press_list/$', views.press_list,name='press_list'),     url(r'^pre/$', ...

  5. 分组,命名分组,url的命名和反向解析

    1.位置分组 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 1.写在url里面的: # 删除 url(r'^del_class/(\d+)',views.del_clas ...

  6. diango url的命名和反向解析

    url的命名和反向解析 静态路由 url(r'^login/', views.login,name='login'), 反向解析ht 模板 {% url 'login' %} --> '/app ...

  7. URL的命名和反向解析

    1. 分组 url(r'^del_publisher/(\d+)', views.del_publisher), 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 2. 命名 ...

  8. django url别名和反向解析 命名空间

    url别名和反向解析 我们平时写的url名字都是死的,如果项目过大,需要项目中某个文件名改动一下,那么改动起来就不是一般的麻烦了,所以我们就在定义的时候给url起一个别名,以后不管哪个文件中运用都是用 ...

  9. day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间

    day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...

  10. Django 路由系统

    Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...

随机推荐

  1. php类知识---最疯狂的魔术方法serialize,_sleep,__wakeup,unserialize,__autoload,__clone

    serialize-----把实例化的对象写入文件 __sleep 调用serialize时触发 <?php class mycoach { public function __construc ...

  2. linux中强大的编辑工具vim

    先来个图镇贴 vim是一个模式编辑器.由三种主要模式比较常用: 1.命令(Normal)模式:默认模式,移动光标,剪切/粘贴文本 2.插入(Insert)或编辑模式:修改文本 3.扩展命令(exten ...

  3. cookbook 10.1生成随机密码

    任务: 随机地创造出新密码.比如,有时需要给新的用户账号分配新的密码. 解决方案: from random import choice import string def GenPasswd(leng ...

  4. P4981 父子 Cayley公式

    CayleyCayley公式的定义是这样的,对于n个不同的节点,能够组成的无根树(原来是无向连通图或者是有标志节点的树)的种数是n^(n-2)种.(这里让大家好理解一点,就写成了无根树,其实应该是一样 ...

  5. NOIP 模拟赛 那些年,我们学过的文化课 --致已退役的fqk神犇.

    /* 这大概是我第一次整理模拟赛吧. 唉. T2打了很长时间. 一开始读错题了中间都能缩合了. 真心对不起生物老师hhh. 这种状态判重的题目还是做的太少! */ 背单词 [题目描述] fqk 退役后 ...

  6. codevs 2924 数独挑战 x(三种做法+超详细注释~)

    2924 数独挑战  时间限制: 1 s  空间限制: 1000 KB  题目等级 : 钻石 Diamond   题目描述 Description “芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今 ...

  7. docker命令集锦

    sudo docker image ls 查看有哪些image镜像sudo docker run hello 运行image 删除全部containerdocker rm $(docker conta ...

  8. js保留二位小数

    js保留小数常用有三种方法,可根据实际情况选择 方法一:使用toFixed保留两位小数 自带四舍五入与补位 var num1 = 55.3715; console.log(num1.toFixed(2 ...

  9. JavaWeb页面静态化之使用freemarker模板生成一个html静态页面

    题外话:       页面静态化(展示数据从JSP页面变成HTML页面)实现方式-->模板技术   从本质上来讲,模板技术是一个占位符动态替换技术.一个完整的模板技术需要四个元素:①模板语言(使 ...

  10. win10备忘

    你要允许来自未知发布者 http://www.xitonghe.com/jiaocheng/Windows10-7809.html输入法 切换繁体 ctrl+shift+F win10 输入法 htt ...