zoukankan      html  css  js  c++  java
  • 66 路由 分组命名与反向解析, url中别名重复的解决方法

    主要内容:

    1 :  发请求http://127.0.0.1:8000/home/1234/12, 后面不用写/的原因

      Django会帮我们自动跳转到location:http://127.0.0.1:8000/home/1234/12/页面, 不是浏览器自动帮我们添加的.

      可以不帮我们自动添加/, 在setting中设置APPEND_SLASH = False, 默认为true自动添加

    2 分组和分组命名

     url(r'^group/[0-9]{4}/([0-9]{2})/$', views.group),  # 分组
        url(r'^group_name/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.group_name),  # 分组命名
    

      views里的代码:

    # 分组匹配
    def group(request, month):分组会传来一个参数, 所以加一个位置参数
        print(month)
        return HttpResponse('ok')
    # 命名分组
    def group_name(request, *args, **kwargs):
        print(args)
        print(kwargs)          #year 和 month相当于关键字参数
        year = kwargs.get('year')   只能写year和month
        month = kwargs.get('month')
        print(year, month)
        return HttpResponse('ok')
    

    3 include其他的URLconfs

    from django.conf.urls import url, include        # 一定要导入include
    from django.contrib import admin
    urlpatterns = [
        url(r'^admin/$', admin.site.urls),
        url(r'app01/', include('app01.urls')),  #可以包含其他的urlconfs文件
    ]
    

    4 给视图添加参数, 会替换原来的值

        url(r'^group_name/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.group_name, {'year': 2018}),  # 分组命名
        url(r'^group_name/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.group_name),  # 分组命名
    

      结论: 无论写什么年份, 都会被2018替换

    命名URL, 和 URL反向解析

      a : 普通的命名和解析

                1. 命名:

          from django.urls import reverse

          url(r'^press_list/', views.press_list, name='press_list'),给我的url匹配模式起名为press_list

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

        2. 反向解析:

          在视图函数中的写法: reverse('press_list')

          在模板中的写法:        {% url 'press_list'%}

      结论: 如果改变我的匹配模式, 可以通过name 方向解析出该匹配模式, 此时就不用修改用到该网址的地方.

      b : 带分组的命名和反向解析:

        1 . 命名:  

          url(r'^have_name_group/([0-9]{4})/([0-9]{2})/$', views.have_name_group, name='group1'), #分组起名

        2 . 反向解析:

          在视图函数中的写法:reverse('group1', args=('2012', '12'))

          在模板中的写法:       {% url 'group1' '2012', '12' %}

      c : 命名分组的命名和反向解析:

        1 : 命名:

          url(r'^name_group/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.name_group, name='group2'), #命名分组起名

        2 : 反向解析:

          在视图函数中的写法:存在两种

            方式一:  reverse('group2', args=('1995', '08'))

            方式二: reverse('group2', kwargs={'year':1995, 'month': '08'}

          在模板中的写法: {% url  'group2'  '1995'  '08'%}

       命名和反向解析的执行流程:

      url中的代码:

    url(r'^name_group/(?P<year>[0-9]{4})/(?P<month>[0-9]{2})/$', views.name_group, name='group2'), #命名分组起名

      视图函数中的代码:

    def name_group(request, *args, **kwargs):
        # print(kwargs)   # {'year': '1234', 'month': '12'}
        # print(kwargs.get('year'))
        # 两种写法
        # print(reverse('group2',args=('2018', '09')))
        print(reverse('group2', kwargs={'year':1995, 'month': 12}))
        return HttpResponse('ok')
    

      访问网址:127.0.0.1:8000/app01/name_group/1995/08/

      先走url, 找到app01的根目录, 匹配1995/08/, 把这两个参数当做位置参数传给视图函数name_group的**kwargs,  然后打印这个字典.

      执行到reverse, 通过'name_group'反向解析得到地址, 即得到一个空的正则表达式, 把后面传的参数进行填充这个正则表达式.

      根据用户/浏览器发起的url请求, 调用正确的jdango视图, 并从url中提取它的参数需要的值

      根据dango视图的标识和将要传递给它的参数的值, 获取与之相关联的url值.

    6 . url别名重复的解决方法

      先在url根目录下:加namespace

         url(r'app02/', include('app02.urls',namespace='app02')),
         url(r'app01/',include('app01.urls',namespace='app01')),

      然后该view视图函数,

        reverse('app01:home',kwargs={'year':'2018','month':'10'}), 如果想要app02下的地址, 直接把app01, 改成app02,

    7 . 反射的用处

    def delete(request, table, delete_id):
        # 先获取到每一个表,
        # print(table)
        # table_dic = {
        #     'press': Press,
        #     'book': Book,
        #     'author': Author,
        # }
        # table_class = table_dic.get(table)
        table_class = getattr(models, table.capitalize())  # 通过反射,从当前对象的拿到类,
        #     反射: 用字符串类型的变量名来访问这个变量的值
        table_class.objects.get(id=delete_id).delete()
        return redirect(reverse(table))
    

      

        

          

          

      

  • 相关阅读:
    【转】Pandas学习笔记(七)plot画图
    【转】Pandas学习笔记(六)合并 merge
    【转】Pandas学习笔记(五)合并 concat
    【转】Pandas学习笔记(四)处理丢失值
    【转】Pandas学习笔记(三)修改&添加值
    【转】Pandas学习笔记(二)选择数据
    17秋 SDN课程 第二次上机作业
    17秋 SDN课程 第三次上机作业
    17秋 SDN课程 第一次上机作业
    Ubuntu 14.04 安装sublime
  • 原文地址:https://www.cnblogs.com/gyh412724/p/9768390.html
Copyright © 2011-2022 走看看