主要内容:
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替换
5 命名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))