Django之路由分发反向解析

时间:2023-12-21 11:09:38

Django路由分发|反向解析

  当一个Django中有多个app时,路由会有很多,将这些路由都写在与项目同名的文件夹下就会显得很多,很乱.并且在协同开发的时候容易出现相同的命名,当项目合并后就会出现路由跳转的问题.此时使用路由分发就可以很好的解决这个问题.

  路由分发使用方法如下:

    1. 先在项目同名的文件夹下导入include模块:

from django.conf.urls import url, include

    2. 在urlpatterns中添加如下代码:

url(r'app01/', include('app01.urls', namespace='app01'))

  路由分发:

 from django.conf.urls import url
from app01 import views urlpatterns = [
url(r'^(grade|student|teacher)_list/$', views.Show.as_view(), name='show'), # 展示
url(r'^add_(grade|student|teacher)/$', views.Add.as_view(), name='add'), # 添加
url(r'^delete_(grade|student|teacher)/(\d+)/$', views.Delete.as_view(), name='delete'), # 删除
url(r'^edit_(grade|student|teacher)/(\d+)/$', views.Edit.as_view(), name='edit'), # 删除
]  

  其中 r'app01' 中的app01为每个app的名字, 'app01.urls'为app01文件夹中的urls.py文件,他的内容为当前app所有的路由都在里边, namespace='app01'是给当前的路由名字,防止后续出现同名是出现覆盖情况,导致跳转问题.

反向解析

  反向解析传参

    在视图函数中,位置传参时,使用args=(xx, oo)的方式,也就是说,传过去的参数必须是元祖,否则会报错.

 class Delete(View):

     def get(self, request, kind, id):
very_kind = getattr(models, kind.capitalize())
very_kind.objects.get(id=id).delete() return redirect(reverse('app01:show', args=(kind,)))

  

  使用反向解析时,必须根据之前的url分组进行传参.无名分组使用位置传参,有名分组使用关键字传参.

  在模板中使用时,根据url的分组数量进行传参,必须一一对应.

 {% extends 'base_list.html' %}

 {% block title_title %}
班级展示
{% endblock %} {% block title_add %}
<h1 style="text-align: center; color: burlywood;">班级展示</h1>
<a href="{% url 'app01:add' 'grade' %}">添加班级</a>
{% endblock %} {% block table_show %}
<table border="1" class="table table-bordered" style="text-align: center; background-color: rgba(0, 0, 0, 0); border: #23527c">
<thead>
<tr style=" border: #23527c">
<th style="text-align: center; border: #23527c">序号</th>
<th style="text-align: center; border: #23527c">ID</th>
<th style="text-align: center; border: #23527c">班级</th>
<th style="text-align: center; border: #23527c">操作</th>
</tr>
</thead>
<tbody>
{% for grade in grade_list %}
<tr style=" border: #23527c">
<td style=" border: #23527c">{{ forloop.counter }}</td>
<td style=" border: #23527c">{{ grade.id }}</td>
<td style=" border: #23527c">{{ grade.name }}</td>
<td style=" border: #23527c">
<a href="{% url 'app01:delete' 'grade' grade.id %}">删除</a>
<a href="{% url 'app01:edit' 'grade' grade.id %}">编辑</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}

  总结下:

 1. 在视图中应用
from django.urls import reverse reverse('press_list') ——》 '/press_list/' '/pre/' 分组:
reverse('home',args=('','')) ——》'/app01/home/2008/09/' 命名分组:
reverse('home',args=('','')) ——》'/app01/home/2008/09/'
reverse('home',kwargs={'year':'','month':''}) 2. 在模板中的应用 {% url 'press_list' %} ——》 '/press_list/' '/pre/' 分组:
{% url 'home' '' '' %} ——》'/app01/home/2008/10/' 命名分组:
{% url 'home' '' '' %} ——》'/app01/home/2008/10/'
{% url 'home' month='' year='' %} ——》'/app01/home/2018/10/' 2. namespace
url(r'app02/', include('app02.urls',namespace='app02')),
url(r'app01/',include('app01.urls',namespace='app01')), reverse('app01:home',kwargs={'year':'','month':''})
reverse('app02:home',kwargs={'year':'','month':''}) {% url 'app02:home' '' '' %}