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))

  

    

      

      

  

原文地址:https://www.cnblogs.com/gyh412724/p/9768390.html