命名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。

最新文章

  1. 3.Java网络编程之IP
  2. configure Git to accept a particular self-signed server certificate for a particular https remote
  3. 使用Unity3D的50个技巧:Unity3D最佳实践
  4. hihocode ---1032
  5. 基于MDK编程STM32程序无法使用,硬件仿真在汇编窗口看到停留在“0x0800XXXX BEAB BKPT 0xAB //进入调试模式”
  6. Docker加速器(阿里云)
  7. Android中三种计时器Timer、CountDownTimer、handler.postDelayed的使用
  8. Eclipse拷贝动态的web工程修改context root的值
  9. Give root password for maintenance(or type control -D to continue)
  10. Codeforces 986C AND Graph dfs
  11. git上传本地Intellij idea 项目到码云的git仓库中
  12. 1.python虚拟环境的安装-用以同时使用py2,py3
  13. javascript中的复制
  14. 求 pi 的近似值题型汇总
  15. vue经验 - 那些自己给自己挖的深坑
  16. [转]MinGW编译wxWidgets问题
  17. jquery remove() detach() empty()三种方法的区别
  18. GIt学习第一天之安装和版本库创建
  19. cocoa pods 升级遇到的问题
  20. 【Java】流与文件(端口 &amp; 文件读写对象)

热门文章

  1. sysbench运行autogen.sh报错
  2. Java开发必备技能!Eclipse快捷方式助力提升开发效率
  3. shell通配符
  4. Python之exec()/compile()方法使用
  5. 深入理解python协程
  6. [Angular 8] Take away: Tools for Fast Angular Applications
  7. SQL CASE Syntax
  8. Binding使用的属性、DataContext上下文绑定必须使用的情况
  9. HYSBZ - 3813 奇数国 欧拉函数+树状数组(线段树)
  10. Vue_(基础)Vue中的事件