• Django路由系统-URL命名&URL反向解析


    命名URL和URL反向解析

    前言

    起始样式,HTML中的href是写死的,不能更改,如下示例代码:

    # urls中
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/$', views.JJzz.as_view()),
        url(r'^jjzz_index/$', views.Index.as_view()),
        url(r'^jjzz_visit/$', views.Visit.as_view(),name='jz'),
    ]
    
    # views中
    class Visit(View):
        jjzz = 'jjzz on the world'
        def get(self, request,**kwargs):
            # return JsonResponse({'jjzz': self.jjzz})
            return render(request,"jjzz_visit.html")
    
    class Index(View):
        jjzz = 'jjzz on the world'
        def get(self, request,**kwargs):
            # return JsonResponse({'jjzz': self.jjzz})
            return render(request,"jjzz.html")
    
    class JJzz(View):
        def get(self, request):
            return redirect("/jjzz_index/")
            
    # HTML模板中
    <body>
    <a href="/jjzz/">欢迎来到叽叽喳喳的世界</a>
    </body>
    

    ​ 为了解决这种不灵活的情况,Django提供了一种可以自动更新URL而不用手动遍历项目的源代码来搜索并替换对应的URL。可以通过URL的匹配规则起一个名字,一个URL匹配,模式起对应一个名字。

    常规URL情况下

    第一步:静态路由命名

    # urls中
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/$', views.JJzz.as_view()),
        url(r'^jjzz_index/$', views.Index.as_view(),name='jjz'),
        url(r'^jjzz_visit/$', views.Visit.as_view()),
    ]
    

    第二步:reverse反向解析

    # views中修改
    # 导入reverse功能
    from django.urls import reverse
    或者 from django.shortcuts import reverse,两个是同一个reverse
    class JJzz(View):
        def get(self, request):
            return redirect(reverse('jjz'))
            # 或者return redirect('jjz')
            
    # HTML模板中
    <body>
    <a href="{% url "jjz" %}">欢迎来到叽叽喳喳的世界</a>
    </body>
    
    【总结】只要name不变,前边的正则匹配怎么变都没有关系
    

    分组情况下

    第一步:静态路由命名

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/$', views.JJzz.as_view()),
        url(r'^jjzz_index/([0-9]{4})/$', views.Index.as_view(),name='jjz'),
        url(r'^jjzz_visit/$', views.Visit.as_view()),
    ]
    

    第二步:reverse反向解析

    # views中
    # 导入reverse功能
    from django.urls import reverse
    class JJzz(View):
        def get(self, request,*args):
            return redirect(reverse('jjz',args=("2019",)))
            
    # HTML模板中
    <body>
    <a href="{% url "jjzz" '2019'%}">欢迎来到叽叽喳喳的世界</a>
    </body>
    
    # 其中
    reverse('jjzz',args=("2019",)   —— 》 /jjzz_index/2019/
    {% url ‘jjzz’ '2019' %}   —— 》 /jjzz_index/2019/
    

    【总结】

    1. 利用args传参时要用元组或者列表将参数包括起来
    2. 在模板中添加参数时,要用字符串的形式

    命名分组情况下

    第一步:静态路由命名

    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^jjzz/$', views.JJzz.as_view()),
        url(r'^jjzz_index/(?P<year>[0-9]{4})/$', views.Index.as_view(),name='jjz'),
        url(r'^jjzz_visit/$', views.Visit.as_view()),
    ]
    

    第二步:reverse反向解析

    # views中
    # 导入reverse功能
    
    from django.urls import reverse
    class JJzz(View):
        def get(self, request,**kwargs):
            return redirect(reverse('jjz',kwargs={"year":'2019'}))
            # 或者 return redirect(reverse('jjz',args=("2019",)))
       
    # HTML文件中
    <body>
    <a href="{% url "jjz" year='2019' %}">欢迎来到叽叽喳喳的世界</a>
    <a href="{% url "jjz" '2019' %}">欢迎来到叽叽喳喳的世界</a>
    </body
    
    # 其中
    reverse('jjz',kwargs={"year":'2019'}) --》  /jjzz_index/2019/
    {% url "jjz" year='2019' %} --》 /jzzz_index/2019/
    

    命名空间模式

    ​ 不同的app中使用相同的URL命名时,使用URL的命名空间模式namespace可以定义唯一反转命名的URL。

    【示例】

    # 主urls中
    from django.conf.urls import url, include
     
    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 app01 import views
     
    app_name = 'app01'
    urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
    ]
    
    # app02的urls中
    from django.conf.urls import url
    from app02 import views
     
    app_name = 'app02'
    urlpatterns = [
        url(r'^(?P<pk>d+)/$', views.detail, name='detail')
    ]
    

    虽然上述两个app中url名称重复了,但是反转URL的时候可以通过命名空间的名称得到对应的URL。

    语法:

    '命名空间名称:URL名称'

     # 模板中使用:
    
    {% url 'app01:detail' pk=12 pp=99 %}
    
     # views中的函数中使用
    
    v = reverse('app01:detail', kwargs={'pk':11})
    

    这样即使app中URL的命名相同,我们也可以反向解析得到正确的URL。

  • 相关阅读:
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (三)
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (二)
    侦测卡 变色龙侦测卡 chameleon-Mini(迷你变色龙) (一)
    Android使用NFC模拟M卡实现 (二)
    scala中eq,==和equals的区别
    scala @BeanProperty 自动添加getter 和setter
    Scala 可变参数
    Flink 侧输出流 DEMO
    Flink 写数据到MySql (JDBC Sink)
    Fink 写数据到kafka (kafka sink)
  • 原文地址:https://www.cnblogs.com/jjzz1234/p/11619888.html
Copyright © 2020-2023  润新知