Django路由系统-URL命名&URL反向解析
命名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/
【总结】
- 利用args传参时要用元组或者列表将参数包括起来
- 在模板中添加参数时,要用字符串的形式
命名分组情况下
第一步:静态路由命名
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反向解析的更多相关文章
- Django路由系统-分组命名匹配
Django路由系统 分组命名匹配 在上述基本配置示例中,使用了简单的正则表达式分组匹配来捕获URL中的值并以位置参数的形式传递给视图,例如url(r'^articles/([0-9]{4})/( ...
- Django之url上的include,URL命名和反向解析,命名空间
include其他的URLconfs #At any point, your urlpatterns can “include” other URLconf modules. This #esse ...
- Django-静态文件导入/url命名及反向解析
一.静态文件导入 js.css.img等都叫做静态文件,那么关于django中静态文件的配置,我们就需要在settings配置文件里面写上这写内容: # STATIC_URL = '/xxx/' #别 ...
- url的命名与反向解析
url命名和反向解析 1. 命名 # url(r'^press_list/$', views.press_list,name='press_list'), url(r'^pre/$', ...
- 分组,命名分组,url的命名和反向解析
1.位置分组 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 1.写在url里面的: # 删除 url(r'^del_class/(\d+)',views.del_clas ...
- diango url的命名和反向解析
url的命名和反向解析 静态路由 url(r'^login/', views.login,name='login'), 反向解析ht 模板 {% url 'login' %} --> '/app ...
- URL的命名和反向解析
1. 分组 url(r'^del_publisher/(\d+)', views.del_publisher), 匹配到参数,按照位置参数的方式传递给视图函数 视图函数需要定义形参接收变量 2. 命名 ...
- django url别名和反向解析 命名空间
url别名和反向解析 我们平时写的url名字都是死的,如果项目过大,需要项目中某个文件名改动一下,那么改动起来就不是一般的麻烦了,所以我们就在定义的时候给url起一个别名,以后不管哪个文件中运用都是用 ...
- day58——模板继承、组件、自定义标签和过滤器、inclusion_tag、静态文件配置、url别名和反向解析、url命名空间
day58 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承它使用) 2. 在母版中定义block块(可以定义多个,整个页面任意位置) {% block co ...
- Django 路由系统
Django 路由系统 基本格式 from django.conf.urls import url urlpatterns = [ url(正则表达式, views视图函数,参数,别名), ] 参数说 ...
随机推荐
- 卸载python
# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps # whereis python|xargs rm -frv
- laravel 视图流程控制,if switch for loop
流程控制 除了模板继承和数据显示之外,Blade 还为常用的 PHP 流程控制提供了便利操作,例如条件语句和循环,这些快捷操作提供了一个干净.简单的方式来处理 PHP 的流程控制,同时保持和 PHP ...
- VS2015 注释英文
在VS2015中,框架.NET4.5的智能提示是英文版本的,其实修改的方法很简单,手动改也十分方面,但是考虑到有时候更新后又会变成英文,其实无非就是里面的汉化包是英文版的而已.所以还是留个笔记,方便进 ...
- java-并发编程之fork/join框架
Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork/Join框架要完成两件事情: 1.任务分 ...
- luoguP1739 表达式括号匹配 x
P1739 表达式括号匹配 题目描述 假设一个表达式有英文字母(小写).运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符.请编写一个程序检查表达式中的左右圆括号是否匹配,若匹 ...
- K8S中的Job和CronJob
Job Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束. Kubernetes支持以下几种J ...
- ssh链接取消密码
进入到存放秘钥的文件夹,输入 ssh-add id_rsa 然后输入两次密码即可.
- AcWing:142. 前缀统计(字典树)
给定N个字符串S1,S2…SNS1,S2…SN,接下来进行M次询问,每次询问给定一个字符串T,求S1S1-SNSN中有多少个字符串是T的前缀. 输入字符串的总长度不超过106106,仅包含小写字母. ...
- Android学习_Fragment
Fragment 使用Fragment 我们可以把屏幕划分成几块,然后进行分组,进行一个模块化的管理.从而可以更加方便的在运行过程中动态地更新Activity的用户界面.另外Fragment并不能单独 ...
- c++ gdb调试的基本使用
https://blog.csdn.net/zdy0_2004/article/details/80102076