一、Django路由
(一)正则
正则: 一种字符串的处理方式,常用来检索或者替换符合规则的内容
- 内容匹配:
- Python中的re模块 re.findall
- 通过匹配内容的类型,长度等进行检索
- 结构匹配:
- xpath 通过某个内容所在的结构检索内容
# 正则
import re
string = "hello world 1 1 \n"
# 原样匹配
# res = re.findall("hello",string)
# print(res)
# 正则
# 类型匹配
# \d 匹配数字
# res = re.findall("\d",string)
# print(res)
# \D 匹配非数字
# res = re.findall("\D",string)
# print(res)
# \w 匹配 字母 数字 下划线
# res = re.findall("\w",string)
# print(res)
# \W 非字母 数字 下划线
# res = re.findall("\W",string)
# print(res)
# \s 匹配 不可见字符
# res = re.findall("\s",string)
# print(res)
# \S 可见字符
# res = re.findall("\S",string)
# print(res)
# [] 匹配包含的字符
res = re.findall("[a-z1-9]",string)
print(res)
string = "151 0101 0101"
# {} 长度
res = re.findall("\d",string)
print(res)
(二)Django中的正则路由
导入 re_path
1、路由正则
2、组匹配
可以将匹配到的内容作为参数(位置参数)进行传递
路由
res = re.findall("\d{5}",string)
print(res)
print("长度匹配")
string = "1212 h h2"
# * 匹配 0个或者多个
res = re.findall("\d*",string)
print(res)
# + 匹配 1个或者多个
res = re.findall("\d+",string)
print(res)
# ?匹配 0或者1个
res = re.findall("\d?",string)
print(res)
# () 组匹配
# string = "151"
# res = re.findall("\d\d",string)
# print(res)
#
# # string = "15 19 01 0w"
# res = re.findall("(\d)\d",string)
# print(res)
# P 组名 组匹配起一个名字
string = "152 0101 0101 0"
res = re.findall("(\d)\d",string)
print(res)
res = re.findall("(?P<xxx>\d)\d",string)
print(res)
# ^ 开头
res = re.findall("^1",string)
print(res)
# $ 结束
res = re.findall("0$",string)
print(res)
(二)Django中的正则路由
导入 re_path
1、路由正则
re_path("hello/\w*/",hello)
2、组匹配
可以将匹配到的内容作为参数(位置参数)进行传递
路由
re_path("atcity/(\w*)/",atcity)
视图
def atcity(request,city):
return HttpResponse("在%s城市" % city)
3、在组名的组匹配
- 可以将匹配到的内容作为参数(关键字参数)进行传递,但是路由中的组名必须和视图中的参数名一样
re_path("atcity_p/(?P<year>\d{4})/(?P<city>\w+)/",atcity_p)
def atcity_p(request,year,city):
return HttpResponse("%s年在%s城市" % (year,city))
二、Django模板
(一)调用模板页面
1、创建模板目录
2、setting中增加配置
3、视图返回模板
from django.shortcuts import render_to_response
def index(request):
return render_to_response("index.html")
(二)模板传值方式
from django.shortcuts import render_to_response
def index(request):
# 第一种
# return render_to_response("index.html",{"name":"zhangsan"})
# 第二种
# params = {
# "name":"zhangsan",
# "age":19
# }
# return render_to_response("index.html",params)
# 第三种 使用locals进行传参
name = "zhangsan"
age = 12
hobby = ["唱歌","跳舞","学习"]
return render_to_response("index.html",locals())
(三) 模板语法
- 1、变量的使用
<p>
{{ name }}
{{ age }}
</p>
<p>
爱好:{{ hobby }}
第二个爱好: {{ hobby.1 }}
</p>
<p>
分数: {{ score }}
python 分数: {{ score.python}}
</p>
- 2、标签语法
if 判断
{% if 条件%}
{% elif 条件%}
{% else %}
{% endif %}
for循环
{% for 可迭代对象 %}
{% endfor %}
<p>
<h2>for循环列表</h2>
{% for one in hobby %}
{{ one }}
{% endfor %}
</p>
<p>
<h2>for循环字典</h2>
{% for key,value in score.items %}
{{ key }}:{{ value }}
{% endfor %}
</p>
forloop 类似于jinja2 中的loop,记录循环状态
counter 计数 从1开始
counter0 计数,从0开始
first 是否是第一个,返回值为布尔值
last 是否为最后一个,返回值为布尔值
revcounter 倒序计数,最小为1
revcounter 倒序计数,最小为0
<h2>隔行变色</h2>
{% for one in hobby %}
{% if forloop.first %}
<p style="background-color: red">{{ forloop.counter }}:{{ one }}</p>
{% elif forloop.last %}
<p style="background-color: blue">{{ forloop.counter }}:{{ one }}
</p>
{% else %}
<p style="background-color: yellow">{{ forloop.counter }}:{{ one }}
</p>
{% endif %}
{% endfor %}
ifequal 判断
{% ifequal age 18 %}
18岁
{% endifequal %}
{% ifequal age 19 %}
19岁
{% endifequal %}
3、模板过滤器
- 对视图传递的数据进行二次处理 语法: {{ 变量 | 方法 }} {{ 变量 | 方法 :参数 }}
- 自带的过滤器 upper lower add safe
<p>
<h2>过滤器</h2>
{{ name | upper | lower}}
{{ age | add:10 }}
{{ html | safe}}
</p>
- 自定义过滤器(掌握)
4、继承和加载
- 页面中有大量的冗余代码的时候,可以使用继承和加载将公共的部分提取
1、继承
-
制作base页面
- 提取公共的部分 - 独有的位置补充块 block
-
子页面继承base页面
-
使用extends继承 打卡相应的块,填入独有的内容
-
2、加载 include -
提供公共的部分,编写一个html文件,在其他页面中,使用include将内容加载到指定的位置
5、静态文件处理
- 在manage.py 同级目录创建static目录
- settings中增加配置
- 模板中使用静态文件
方法1
<img src="/static/gtl.jpg" alt="">
方法2
- 在html文件的头部导入static
{% load static %}
- 使用静态文件
<img src="{% static '图片路径/图片名' %}" alt="">
(四) 加载静态页面
- 制作base页面
1.增加title块
2.style块
3.content 内容块
4.js 块
三、Django中的ORM
(一)Django App
App(application)就是应用的意思,当项目足够大的时候,我们将功能单独分成多个App进行开
发。Django 鼓励程序员进行松耦合开发,就是将项目拆分成独立的功能块进行开发,减少代码相互的
耦合(依赖)程度,保证代码的可维护性和项目结构的清晰程度。
1、创建App
进入manage.py同级目录,执行命令
python manage.py startapp appname
|-projectname 工程目录
|-app01
|-migrations 数据库迁移目录
|- __init__.py 子应用初始化文件
|- admin.py 站点管理
|- apps.py 子应用文件,记录了子应用的一些信息,例如子应用的名字等
|- models.py 模型文件
|- test.py 测试文件,大多情况下编写单元测试内容
|- views.py 视图文件
2、注册app
3、使用
- 子应用中的views中配置视图
配置路由
4、Pycharm创建子应用