Django之路由分发反向解析
Django路由分发|反向解析
当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路由跳转的问题.此时使用路由分发就可以很好的解决这个问题.
路由分发使用方法如下:
1. 先在项目同名的文件夹下导入include模块:
from django.conf.urls import url, include
2. 在urlpatterns中添加如下代码:
url(r'app01/', include('app01.urls', namespace='app01'))
路由分发:
1 from django.conf.urls import url 2 from app01 import views 3 4 urlpatterns = [ 5 url(r'^(grade|student|teacher)_list/$', views.Show.as_view(), name='show'), # 展示 6 url(r'^add_(grade|student|teacher)/$', views.Add.as_view(), name='add'), # 添加 7 url(r'^delete_(grade|student|teacher)/(\d+)/$', views.Delete.as_view(), name='delete'), # 删除 8 url(r'^edit_(grade|student|teacher)/(\d+)/$', views.Edit.as_view(), name='edit'), # 删除 9 ]
其中 r'app01' 中的app01为每个app的名字, 'app01.urls'为app01文件夹中的urls.py文件,他的内容为当前app所有的路由都在里边, namespace='app01'是给当前的路由名字,防止后续出现同名是出现覆盖情况,导致跳转问题.
反向解析
反向解析传参
在视图函数中,位置传参时,使用args=(xx, oo)的方式,也就是说,传过去的参数必须是元祖,否则会报错.
1 class Delete(View): 2 3 def get(self, request, kind, id): 4 very_kind = getattr(models, kind.capitalize()) 5 very_kind.objects.get(id=id).delete() 6 7 return redirect(reverse('app01:show', args=(kind,)))
使用反向解析时,必须根据之前的url分组进行传参.无名分组使用位置传参,有名分组使用关键字传参.
在模板中使用时,根据url的分组数量进行传参,必须一一对应.
1 {% extends 'base_list.html' %} 2 3 {% block title_title %} 4 班级展示 5 {% endblock %} 6 7 {% block title_add %} 8 <h1 style="text-align: center; color: burlywood;">班级展示</h1> 9 <a href="{% url 'app01:add' 'grade' %}">添加班级</a> 10 {% endblock %} 11 12 {% block table_show %} 13 <table border="1" class="table table-bordered" style="text-align: center; background-color: rgba(0, 0, 0, 0); border: #23527c"> 14 <thead> 15 <tr style=" border: #23527c"> 16 <th style="text-align: center; border: #23527c">序号</th> 17 <th style="text-align: center; border: #23527c">ID</th> 18 <th style="text-align: center; border: #23527c">班级</th> 19 <th style="text-align: center; border: #23527c">操作</th> 20 </tr> 21 </thead> 22 <tbody> 23 {% for grade in grade_list %} 24 <tr style=" border: #23527c"> 25 <td style=" border: #23527c">{{ forloop.counter }}</td> 26 <td style=" border: #23527c">{{ grade.id }}</td> 27 <td style=" border: #23527c">{{ grade.name }}</td> 28 <td style=" border: #23527c"> 29 <a href="{% url 'app01:delete' 'grade' grade.id %}">删除</a> 30 <a href="{% url 'app01:edit' 'grade' grade.id %}">编辑</a> 31 </td> 32 </tr> 33 {% endfor %} 34 </tbody> 35 </table> 36 {% endblock %}
总结下:
1 1. 在视图中应用 2 from django.urls import reverse 3 4 reverse('press_list') ——》 '/press_list/' '/pre/' 5 6 7 分组: 8 reverse('home',args=('2008','09')) ——》'/app01/home/2008/09/' 9 10 命名分组: 11 reverse('home',args=('2008','09')) ——》'/app01/home/2008/09/' 12 reverse('home',kwargs={'year':'2018','month':'10'}) 13 14 2. 在模板中的应用 15 16 {% url 'press_list' %} ——》 '/press_list/' '/pre/' 17 18 分组: 19 {% url 'home' '2009' '10' %} ——》'/app01/home/2008/10/' 20 21 命名分组: 22 {% url 'home' '2008' '10' %} ——》'/app01/home/2008/10/' 23 {% url 'home' month='10' year='2018' %} ——》'/app01/home/2018/10/' 24 25 2. namespace 26 url(r'app02/', include('app02.urls',namespace='app02')), 27 url(r'app01/',include('app01.urls',namespace='app01')), 28 29 reverse('app01:home',kwargs={'year':'2018','month':'10'}) 30 reverse('app02:home',kwargs={'year':'2018','month':'10'}) 31 32 33 {% url 'app02:home' '2018' '10' %}