zoukankan      html  css  js  c++  java
  • Django反向解析(上)

     

    一 反向解析的作用:

      在Django项目中,经常需要获取对象的URL,为生成的内容配置URL地址,例如在html模板中需要写上<a>标签中的跳转地址等等。

    这时候,如果某个地址在urls路由配置中发生了变化,那么所有的与之相关的URL地址都要重新替换一次,这将非常麻烦,下面我们可以用反向解析的方式在避免这种问题。

     

    二 我们直接以示例展示:

      2.1 这是我的代码结构(新建了两个applications: app01/app02,具体建立配置命令就不贴上来了^_^!)

      

     

     

       2.2 在主配置文件中配置urls路由信息(引入了两个我们新建的app01和02)

        

     

     

       2.3 在app01和app2的urls中分别配置测试用的urls

     

     

     

         app01/urls.py

    from django.urls import path, re_path
    from . import views
    
    urlpatterns = [
        # re_path('(0-9){2}/$', views.test, name="app_01"),
        re_path('test/$', views.test, name="app_01"),
    ]

        app02/urls.py

    from django.urls import path, re_path
    from . import views
    
    urlpatterns = [
        re_path('test/([0-9]{2})/$', views.test, name="app_02"),  #匹配test/(参数为:0到9的数字,要求2个),  匹配后交给vivews.test函数处理,  给当前匹配URL定义一个别名("app_02")
    ]

     

      2.4 配置app01和app02的视图views.py配置

        app01/views.py

    from django.shortcuts import render
    from django.http import HttpResponse
    from django.shortcuts import redirect,reverse
    
    # Create your views here.
    
    def test(request):
        return render(request,'test.html')  #返回一个模板页面"test.html"给客户端页面.

        app02/views.py

    from django.shortcuts import render
    from django.http import HttpResponse
    
    # Create your views here.
    def test(request,arg):
        if request.method == 'GET':
            print("传值为:%s"%arg) #在控制台打印一下传入的参数
        return HttpResponse("app2 is loads")  #返回字符串"app2 is loads"给客户端页面,表示跳转成功。

      

      2.5 配置模板文件

        创建模板文件:/statics/test.html  

        注意:需要先在settings.py配置文件,配置好静态文件目录地址,我们配置的静态文件路径为,项目根目录下的/statics

        

     

     

         test.html 内容:

     

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>test direct test</title>
    </head>
    <body>
        <p><a href="{% url 'app_02' 12 %}">跳转到app2</a></p>  <!-- url '变量名' (传参,如果视图函数没有参数那么也可以忽略,这里给一个默认参12) -->
    </body>
    </html>

     

    三 启动项目,测试:

        3.1 在命令行中启动项目测试

    python manage.py runserver 0.0.0.0:8000

        3.2 打开URL 地址,我们看到有两个app的匹配路径

        

     

     

        3.3 我们输入app01/test/

          这里显示了app01//vives.py视图中test函数定义的返回值

        

     

     

     

        3.4 我们点击“跳转到app02”,发现已经跳转到了app02

          

     

     

    四 修改URL,在测试跳转

        上面我们已经成功展示了利用name别名在模板中引用URL地址,下面我们修改一下URL地址,看看name别名是否能自动识别到。

        4.1 修改app02/urls.py

        

    from django.urls import path, re_path
    from . import views
    
    urlpatterns = [
        re_path('test111/([0-9]{2})/$', views.test, name="app_02"),   #将匹配test修改成匹配test111/,
    ]

        4.2 重新加载app01的URL

          4.2.1 鼠标放入跳转URL处,不要点击,我们看到URL地址已经动态变更为app02/test111 (这里证明地址已经动态修改了)

          4.2.2 然后我们在点击跳转字符

      

     

     

     

        4.2.3 成功跳转到新的URL地址 

           演示结束。

          

     

     

     

     五 反向解析在视图代码中的使用

      5.1 编辑app1的视图代码 app01/views.py

    from django.http import HttpResponseRedirect
    from django.urls import reverse
    def test(request):
        # return render(request,'test.html')
        return HttpResponseRedirect(reverse("app_02",args=(11,))) #利用HttpResponseRedirect跳转到reverse解析的'name' URL地址。

      5.2 浏览器输入app1的URL:localhost:8000/app01/test/

        浏览器会自动跳转到app2的URL

        完成测试。

     

     

     

     

    如有错误欢迎大家指正,共同学习成长^_^

        

  • 相关阅读:
    [HNOI2002]营业额统计
    HDU 1374
    HDU 3345
    HDU 2089
    Graham扫描法
    Codeforces 1144D Deduction Queries 并查集
    Codeforces 916E Jamie and Tree 线段树
    Codeforces 1167F Scalar Queries 树状数组
    Codeforces 1167E Range Deleting
    Codeforces 749E Inversions After Shuffle 树状数组 + 数学期望
  • 原文地址:https://www.cnblogs.com/l729414559/p/15089900.html
Copyright © 2011-2022 走看看