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'  %}
原文地址:https://www.cnblogs.com/ZN-225/p/9766896.html