zoukankan      html  css  js  c++  java
  • 反向生成url

    反向生成url

    一.常规的url系统:

    from django.conf.urls import url
    from django.shortcuts import HttpResponse, render, redirect
    def index(request):
        return HttpResponse("进入index")
    def text(requext):
        return HttpResponse("进入text")
    urlpatterns = [
        # url(r'^admin/', admin.site.urls),   
        url(r'^index/', index),
        url(r'^text/', text),
    ]
    

    执行过程如下图:

    从这里我们知道常规的url是需要在地址栏中将访问的地址对应着urlpatterns中的地址吻合进行访问,所以当出现下面这种情况的话就对访问的友好度极低:

    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        url(r'^arya/', site.urls),
        url(r'^index/asdas/asdas/da/asd/as', index),
        url(r'^text/dasd/asd/asd/sad/asd/as/d', text),
    ]
    

    二、反向生成url

    1.reverse方法
    def index(request):
        from django.urls import reverse
        test_url = reverse('xx')
        print(test_url)	
        return HttpResponse("进入index")
    def text(requext):	
        return HttpResponse("进入text")
    urlpatterns = [
        url(r'^index/', index,),
        url(r'^text/dasd/asd/asd/sad/asd/as/d', text,name='xx'),
    ]
    

    打印的结果:

    /text/dasd/asd/asd/sad/asd/as/d
    

    这个url就是text的url路径,所以通过给其定义一个name就可以反向生成一个其对应的url地址

    2.带参数的url的反向生成:
    def index(request):
        from django.urls import reverse
        test_url = reverse('xx',args=(2,9))
        return redirect(test_url)
    
    def text(requext,*args,**kwargs):
    
        return HttpResponse("进入text")
    urlpatterns = [
        url(r'^index/', index,),
        url(r'^text/dasd/asd/(d+)/sad/(d+)/as/d', text,name='xx'),
    ]
    

    这里需要注意的是当text中的url中需要传参所以对应的text视图函数中就需要*args,**kwargs接受参数

    3.带命名的正则url
    def index(request):
        from django.urls import reverse
        test_url = reverse('xx',kwargs={'a1':8,'a2':99})
        return redirect(test_url)
    
    def text(requext,*args,**kwargs):
    
        return HttpResponse("进入text")
    urlpatterns = [
        url(r'^index/', index,),
        url(r'^text/dasd/asd/(?P<a1>d+)/sad/(?P<a2>d+)/as/d', text,name='xx'),
    ]
    

    这里和常规带参数的唯一不同reverse方法中是传递一个kwargs的键值对的字典

    4.前端显示反向url
    • test_url = reverse('xx',kwargs={'a1':8,'a2':99})

    渲染效果:

    • test_url = reverse('xx',args=(2,9))

    渲染效果:

    反向生成url嵌套(namespance)

    1.单层嵌套
    def index(request):
        from django.urls import reverse
        test_url = reverse('x1:txt')
        return HttpResponse("index")
    
    def text(request,*args,**kwargs):
        return HttpResponse('text')
    urlpatterns = [
    
        url(r'^app01/', ([
            url(r'^index/', index,name='idx'),
            url(r'^test/', text,name='txt')
                         ],'x1','x2'),),
    ]
    

    上述的url中相当于嵌套了一层,且有namespance(x1,x2),所以对于这类的url的反向生成需要如下操作:

    test_url = reverse('x1:txt')
    
    2.多层嵌套
    def index(request):
        from django.urls import reverse
        test_url = reverse('x1:txt')
        return HttpResponse("index")
    def text(request,*args,**kwargs):
        return HttpResponse('text')
    urlpatterns = [
        url(r'^app01/', ([
            url(r'^userinfo/', (
                [
                url(r'^index/', index,name='idx'),
                url(r'^test/', text,name='txt')
                             ],None,None)),
         ] ,'x1','x2')),
        ]
    

    这里双层嵌套的url,但是内层的namespance都是空所以它会往外层找,所
    以反向生成的代码:

    test_url = reverse('x1:txt')
    

    同时当内层namespance有值时:

    urlpatterns = [
        # url(r'^admin/', admin.site.urls),
        # url(r'^arya/', site.urls),
        url(r'^app01/', ([
            url(r'^userinfo/', (
                [
                url(r'^index/', index,name='idx'),
                url(r'^test/', text,name='txt')
                             ],'x2','x2')),
         ] ,'x1','x1')),
        ]
    

    反向生成url代码就是如下:

    def index(request):
        from django.urls import reverse
        test_url = reverse('x1:x2:txt')
        print(test_url)
        return HttpResponse("index")
    
    def text(request,*args,**kwargs):
    
        return HttpResponse('text')
    

    所以通过上述的案例可以知道,不管url嵌套多少层,其反向生成url的规则是一样的,遵循的规则就是namespance从外层以冒号连接至最后一层。

  • 相关阅读:
    如何评估自己对外界认知是否正确?
    冒泡排序与两数交换的实现与优化
    数据库和ADO
    JavaScript的中类型转换
    UltraEdit注册机原理简单说明
    别让用户发呆—设计中的防呆策略[转]
    Html 5 版 电子时钟
    SQL 优化总结(三) SQL子句
    SQL 优化总结(二) 索引
    Html 5 简介
  • 原文地址:https://www.cnblogs.com/lijian-22huxiaoshan/p/7739300.html
Copyright © 2011-2022 走看看