• django路由层(二) 反向解析和名称空间


    url命名和反向解析

    根据名字动态获取到对应的路径

    可以给每一个路由与视图函数对应关系起一个名字
    这个名字能够唯一标识出对应的路径
    注意这个名字不能重复是唯一的


    应用场景


    通过别名来传递路径给到前端或者后端,好处是更加灵活,因为是通过别名进行传递,所以只要修改源路径,其他的层都不需要更改,否则如果直接通过源路径传递,则耦合度较高,不够灵活,维护成本太高


    无分组反向解析

    第一步: 命名


    url(r'^pre/', views.press_list, name='press_list')
    

    第二步: 反向解析


    在视图中使用

    reverse('你给路由与视图函数对应关系起的别名')


    from django.urls import reverse
    reverse('press_list')			--->		'/pre/'
    

    在模板中使用

    {% url '你给路由与视图函数对应关系起的别名' %}


    {% url 'press_list' %}
    

    无名分组反向解析


    第一步: 命名


    >>>> urls.py
    url(r'^app01/', include('app01.urls'))
    
    >>>> app01.urls.py
     url(r'^index/(d+)/(d+)/$', views.index, name='index')
    
    >>>> app01.views.py
    from django.shortcuts import render, redirect, HttpResponse
    
    def index(request, year, month):
        # return HttpResponse(reverse('index', args=(year, month)))
        return render(request, 'home.html', locals())
    

    第二步: 反向解析


    在视图层使用

    `


    from django.url import reverse
    reverse('index', args=(year, month))		--->		/app01/index/2019/10/
    

    在模板中使用

    {% url '你给路由与视图函数对应关系起的别名' %}


    {% url 'index' 2019 10 %}
    

    有名分组反向解析


    第一步: 命名


    >>>> urls.py
    url(r'^app01/', include('app01.urls'))
    
    >>>> app01.urls.py
    url(r'^home/(?P<year>d+)/(?P<month>d+)/$', views.home, name='home')
    
    >>>> app01.views.py
    from django.shortcuts import render, redirect, HttpResponse
    
    def home(request, year, month):
        # return HttpResponse(reverse('home', kwargs={'year': year, 'month': month}))
        return render(request, 'home.html', locals())
    

    第二步: 反向解析


    在视图层使用


    from django.url import reverse
    reverse('home', kwargs={'year': year, 'month': month})  ---> /app01/home/2019/10
    

    在模板层使用


    {% url 'home' month=2019 year=10 %}
    

    注意

    针对有名分组与无名分组的反向解析统一采用一种格式即可

    反向解析的本质:就是获取到一个能够访问名字所对应的视图函数


    名称空间

    即使不同的APP使用相同的URL名称,URL的命名空间模式也可以让你唯一反转命名的URL。

    不使用名称空间,两个app出现同名的路由名字,则匹配到就会匹配,这样的话两个app访问的是同一个网页,并不是不同的

    • 先创建一个新的app
    manage.py@dj4 > startapp app02
    

    • 注册app

    settings.py

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'app01.apps.App01Config',
        'app02.apps.App02Config',
    ]
    

    案例

    urls.py

    from django.conf.urls import url, include
    from app01 import views
    
    
    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 . import views
    
    urlpatterns = [
        url(r'^home/(?P<year>d+)/(?P<month>d+)/$', views.home, name='home'),
    ]
    

    app01.views

    from django.shortcuts import render, redirect, HttpResponse
    from django.urls import reverse
    
    
    def home(request, year, month):
        return HttpResponse(reverse('app01:home', kwargs={'year': year, 'month': month}))
    

    app02.urls

    from django.conf.urls import url
    from . import views
    
    urlpatterns = [
        url(r'^home/(?P<year>d+)/(?P<month>d+)/$', views.home, name='home'),
    ]
    

    app02.views

    from django.shortcuts import render, redirect, HttpResponse
    from django.urls import reverse
    
    
    def home(request, year, month):
        return HttpResponse(reverse('app02:home', kwargs={'year': year, 'month': month}))
    

    代码下载

    gitee

  • 相关阅读:
    【FPGA篇章四】FPGA状态机:三段式以及书写方法
    【FPGA篇章三】FPGA常用语句:Verilog基本语法要素
    【FPGA篇章二】FPGA开发流程:详述每一环节的物理含义和实现目标
    【FPGA篇章一】FPGA工作原理:详细介绍FPGA实现编程逻辑的机理
    学习python随笔记
    Spring中的@Bean注解、@Configuration注解、@Value
    什么是Maven项目
    SpringBoot(四)thymeleaf+MyBatis+MySql
    SpringBoot(三)thymeleaf+JPA+MySql
    SpringBoot(二)thymeleaf模板的引入
  • 原文地址:https://www.cnblogs.com/cjwnb/p/11790092.html
Copyright © 2020-2023  润新知