zoukankan      html  css  js  c++  java
  • 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'  %}
  • 相关阅读:
    移动端测试小技巧分享
    【转】GT 的性能测试方案解析
    【测试工具】Macaca 自动遍历器 NoSmoke
    接口自动化测试
    【学习资料】 持续集成---测试自动化学习
    pipeline-安全测试
    【转】Appium 优化版
    SpringBoot2(003):简要回顾“HelloWorld” web 工程
    idea创建同名的maven工程时报错:Failed to create a Maven project 'xxx/pom.xml' already exists in VFS
    Maven:Unable to import maven project: See logs for details
  • 原文地址:https://www.cnblogs.com/ZN-225/p/9766896.html
Copyright © 2011-2022 走看看