$Django 路由层(有,无名分组、反向解析、总路由分发、名称空间、伪静态)
1 简单配置
-第一个参数是正则表达式(如果要精准匹配:'^publish/$')
-第二个参数是视图函数(不要加括号)
-url(r'^admin/', admin.site.urls),
注:
当为网站根目录实现一个视图,你需要使用URL模式`` ‘^$’`` , 它代表一个空字符串
不需要添加一个前导的反斜杠,因为每个URL 都有。例如,应该是^articles
而不是 ^/articles
。
每个正则表达式前面的'r' 是可选的但是建议加上。它告诉Python 这个字符串是“原始的” —— 字符串中任何字符都不应该转义
2 无名分组
-按位置传参
-分组之后,会把分组出来的数据,当位置参数,传到视图函数,所以,视图函数需要定义形参
-url(r'^publish/([0-9]{4})/([0-9]{2})$', views.publish),
-def publish(request,*args): 视图函数可以这样接收
3 有名分组
-按关键字传参
-有名分组之后,会把分组出来的数据,当关键字参数,传到视图函数,所以,视图函数需要定义形参,形参名字要跟分组的名字对应,与顺序无关
-url(r'^publish/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publish),
-def publish(request, mounth,year):
*****有名分组和无名分组,不要混用
4 反向解析
-先命一个名:
-1 无参数:url(r'^publishadd133/$', views.publishadd,name='ddd'),
-2 无名分组:url(r'^publishadd/([0-9]{4})/([0-9]{2})/$', views.publishadd,name='ddd'),
-3 有名分组:url(r'^publishadd/(?P<year>[0-9]{4})/(?P<mounth>[0-9]{2})/$', views.publishadd,name='ddd'),
-在模板层:
-1 无参数:{% url 'ddd' %}
-2 无名分组的:{% url 'ddd' foo.id %}
-3 有名分组:{% url 'ddd' foo.year foo.mounth %} 还可以 {% url 'ddd' year=foo.year mounth=foo.mounth %}
-在视图层:
from django.shortcuts import reverse
在视图函数里:
1 无参数:url=reverse('ddd')
1 无名分组:url=reverse('ddd',args=(2018,12,))
1 有名分组:url=reverse('ddd',args=(2018,12,)) 还可以 url=reverse('ddd',kwargs={'year':2018,'mounth':12})
5 路由分发
1 在不同的app里创建urls.py
2 在总路由
-from django.conf.urls import include
-url(r'^blog/',include('blog.urls')),
-url(r'^app01/',include('app01.urls')),
3 在不同的app的urls里配置路由关系
***重点***总路由,有子路由的 不能加结束符$
**** 项目下多个app项目****
注意点:.可以在每个app下的model见表或者单独一个app管理model
.每个app下的admin.py都可以注册任意一个app的表,在后台表还是归类到自己所在的一个app下.
6 名称空间
-url(r'^blog/',include('blog.urls',namespace='blog')),
-子路由:url(r'^publish/$', views.publish,name='test'),
-反向解析:
-视图层:url = reverse('blog:test')
-模板层:{% url 'app01:test'%}
***一般不要用***
用这个:子路由:url(r'^publish/$', views.publish,name='app01_test'),
7 伪静态
-路由:url(r'^book/(?P<id>\d+.html)',views.book),
-访问:http://127.0.0.1:8000/book/4.html
8 转化器
-django1.几版本的url和2.几的re_path用法一样.
-django2.几的path
path(准确路径,视图函数) #与re_path(正则表达式,视图函数)第一个参数不同
1.path(‘index/’,index)
2.path(r'index/<int:year>/',index2) #与url(r'index/(?P<year>[0-9]{4)/$',index3) 差不多,就第一个参数不同
-默认path的转化器
str非空字符串不包含/
path非空字符串
int 整数
slug字母 数字 - _ 的字符串
uuid 格式化的uuid 如:075194d3-6885-417e-a8a8-6c931e272f00
-自定义path的转化器
#a.py定义转化器
class FourDigitYearConverter:
regex = '[0-9]{4}' #类属性 str类型
def to_python(self, value): #value是regex匹配到的str,返回值为视图函数接收值
return int(value)
def to_url(self, value): #通常返回str(value) 用于url反向引用
return '%04d' % value
#使用
from django.urls import register_converter, path
from app01 import views
import a
#注册
register_converter(a.FourDigitYearConverter, 'xxx')
urlpatterns = [
path('articles/2003/', views.special_case_2003),
path('articles/<xxx:year>/', views.year_archive),
...
]
随机推荐
- HDU 1036(平均速度 **)
题意是求出跑了 n 圈每圈 m km 的个人的平均速度. 控制格式,特别注意,题意是输出 -:--:-- 的该人成绩作废,但要把他其他的成绩输进去,不能直接就 break ,输出也就只有一个 - ,而 ...
- 一.ArrayList原理及实现学习总结
一.ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组.与Java中的数组相比,它的容量能动态增长.类似于C语言中的动态申请内存,动态增长内存. 当创 ...
- 数据库设计理论与实践·<一>总结
一.数据库生命周期 数据库生命周期流程图如下: 二.各阶段附图 附图1.1 数据流图 附图1.2 数据字典-方式1 补充说明:数据字典既可以单张表格表示,也可以多种(数据项表/数据结构表/数据流表/外 ...
- LOJ #2196「SDOI2014」LIS
直接退流复杂度好优越啊 LOJ #2196 题意 一段数列,每个点有点权$ A_i$,删除代价$ B_i$,附加属性$ C_i$ 求最小代价使得$ LIS$长度发生变化,且输出一种$ C_i$字典序最 ...
- JAVA进阶3
间歇性混吃等死,持续性踌躇满志系列-------------第3天 1.局部内部类 局部内部类是指在类的方法中定义的内部类,它的作用范围也是在这个方法体内. class SellOutClass{ p ...
- 【blog】Hibernate5如何设置SQLite的方言(待更新...)
参考链接 Hibernate3.Hibernate4.Hibernate5 hibernate5连接sqlite (目前参考的是这个方法)
- DeepLearning.ai-Week3-Autonomous driving-Car detection
1 - Import Packages import argparse import os import matplotlib.pyplot as plt from matplotlib.pyplot ...
- Javascript框架 - ExtJs - 类
类(ExtJs Class) preparation! 我用的是ext-4.2,解压后会得到以下文件 学习要用到的文件很少,现在保留以下文件和整个文件夹,然后删除其它文件并保持目录结构.本页面底部有提 ...
- python初级实战-----关于邮件发送问题
python发邮件需要掌握两个模块的用法,smtplib和email,这俩模块是python自带的,只需import即可使用.smtplib模块主要负责发送邮件,email模块主要负责构造邮件. sm ...
- pythonのsqlalchemy简单查询
#!/usr/bin/env python import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.dec ...