• 【Django框架】——20 Django视图 02 路由命名和反向解析


    在这里插入图片描述

    在这里插入图片描述

    Django 项⽬中,⼀个常⻅需求是获取最终形式的 URL,⽐如⽤于嵌⼊⽣成的内容中(视图和资源⽹址,给⽤户展示⽹址等)或⽤户服务器端的导航处理(重定向等)。

    强烈建议不要硬编码 URL(这是⼀个费⼒、不能扩展、容易出错的主意)。同样危险的是设计临时机制来⽣成的 URLURLconf描述的设计的URL⼀样,这会导致URL 随着时间的推移变得过时。

    换句话说,需要的是 DRY 机制。除其他优势外,它还允许 URL 设计⾃动更新,⽽不必遍历所有项⽬代码来搜索和替换过时的 URL

    Django 提供执⾏反转 URL 的⼯具,这些⼯具与需要 URL 的不同层匹配:

    • 在模板⾥:使⽤ url 模板标签。
    • Python 编码:使⽤ reverse() 函数。

    一、 路由命名

    在定义路由的时候,可以为路由命名,⽅便查找特定视图的具体路径信息。

    1.在定义普通路由时,可以使⽤name参数指明路由的名字,如:

    # -*- coding: utf-8 -*-
    # @File  : urls.py
    # @author: 北极的三哈
    # @email : Flymeawei@163.com
    # @Time  : 2022/10/29 上午5:34
    """"""
    from django.urls import path, re_path
    from project01 import views
    
    urlpatterns = [
        path('login/', views.loginView),
        path('other/sanha/awei/', views.otherView, name='other'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.在使⽤include函数定义路由时,可以使⽤namespace参数定义路由的命名空间。

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('mydj/', include(('project01.urls', 'project01'), namespace='project01-app'))
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    命名空间表示,凡是film.urls中定义的路由,均属于namespace指明的filmapp名下。

    命名空间的作⽤:避免不同应⽤中的路由使⽤了相同的名字发⽣冲突,使⽤命名空间区别开。

    二、reverse反向解析

    使⽤reverse函数,可以根据路由名称,返回具体的路径。

    根路由

    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('mydj/', include('project01.urls'))
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    子路由

    # -*- coding: utf-8 -*-
    # @File  : urls.py
    # @author: 北极的三哈
    # @email : Flymeawei@163.com
    # @Time  : 2022/10/29 上午5:34
    """"""
    from django.urls import path, re_path
    from project01 import views
    
    urlpatterns = [
        path('login/', views.loginView),
        path('other/sanha/awei/', views.otherView, name='other'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    views.py

    from django.shortcuts import render
    from django.http import HttpRequest, HttpResponseRedirect, HttpResponse
    from django.urls import reverse
    
    # Create your views here.
    
    
    def loginView(request):
        """
        :param request:
        :return:
        """
        url = reverse('other')
        print(url)
        return HttpResponseRedirect(url)
    
    
    def otherView(request):
        """
        :param request:
        :return:
        """
        return HttpResponse('OtherView')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    访问:http://127.0.0.1:8000/mydj/login/
    在这里插入图片描述

    跳转:http://127.0.0.1:8000/mydj/other/sanha/awei/
    在这里插入图片描述


    三、通过URL模板页面进行传参

    根路由urls.py
    在这里插入图片描述

    子路由urls.py

    # -*- coding: utf-8 -*-
    # @File  : urls.py
    # @author: 北极的三哈
    # @email : Flymeawei@163.com
    # @Time  : 2022/10/29 上午5:34
    """"""
    from django.urls import path, re_path
    from project01 import views
    
    urlpatterns = [
        path('login/', views.loginView),
        path('other/sanha/awei/', views.otherView, name='other'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    视图函数views.py

    from django.shortcuts import render
    from django.http import HttpRequest, HttpResponseRedirect, HttpResponse
    from django.urls import reverse
    
    # Create your views here.
    
    
    def loginView(request):
        """
        :param request:
        :return:
        """
        # url = reverse('other')
        # print(url)
        # return HttpResponseRedirect(url)
        return render(request, 'project01/index.html')
    
    
    def otherView(request, uname):
        """
        :param request:
        :return:
        """
        return HttpResponse('OtherView--%s' % uname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    templates/project01/index.html

    DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Titletitle>
    head>
    <body>
        <a href="{% url 'other' 'Hello' %}">URLa>
    body>
    html>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    在这里插入图片描述

    访问:127.0.0.1:8000/mydj/login/
    在这里插入图片描述

    点击URL
    在这里插入图片描述

    重定向:http://127.0.0.1:8000/mydj/other/sanha/awei/Hello
    在这里插入图片描述

    # -*- coding: utf-8 -*-
    # @File  : urls.py
    # @author: 北极的三哈
    # @email : Flymeawei@163.com
    # @Time  : 2022/10/29 上午5:34
    """"""
    from django.urls import path, re_path
    from project01 import views
    
    urlpatterns = [
        path('login/', views.loginView),
        path('other/sanha/flyme/', views.otherView, name='other'),
    ]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    访问:127.0.0.1:8000/mydj/login/
    在这里插入图片描述

    重定向:http://127.0.0.1:8000/mydj/other/sanha/flyme/awei
    在这里插入图片描述

    四、namespace

    • 对于未指明namespace的,reverse(路由name)
      在这里插入图片描述

    • 对于指明namespace的,reverse(命名空间namespace:路由name)
      在这里插入图片描述

    1.reverse反向解析

    根路由:urls.py
    在这里插入图片描述
    视图函数:views.py

    from django.shortcuts import render
    from django.http import HttpRequest, HttpResponseRedirect, HttpResponse
    from django.urls import reverse
    
    # Create your views here.
    
    
    def loginView(request):
        """
        :param request:
        :return:
        """
        url = reverse('project01-app:other', args=['awei'])
        print(url)
        return HttpResponseRedirect(url)
        # return render(request, 'project01/index.html')
    
    
    def otherView(request, uname):
        """
        :param request:
        :return:
        """
        return HttpResponse('OtherView--%s' % uname)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    在这里插入图片描述

    2.url模板标签

    视图函数
    在这里插入图片描述

    index.html页面
    在这里插入图片描述

    根路由
    在这里插入图片描述

    子路由
    在这里插入图片描述

    python manage.py runserver
    
    • 1

    访问:127.0.0.1:8000/mydj/login/
    在这里插入图片描述

  • 相关阅读:
    内卷、躺平与中年危机的相关思考
    设计模式-责任链-笔记
    【C++数据结构】B树概念及其实现(详解)
    JSON一些注意语法点
    中西部地区教育正获优质均衡高质量发展
    数智化重塑冷链物流行业,SaaS云系统开发方案赋能冷链企业实现高效运营
    2023-9-11 拆分-Nim游戏
    底层驱动day2作业
    HTML5的语义元素
    程序员们有什么好的编程习惯?
  • 原文地址:https://blog.csdn.net/m0_68744965/article/details/127591033