Day 06 模板层补充
Day 06 模板层补充
一、自定义标签和过滤器
1、自定义标签
1.1 配置文件路径
在setting中的INSTALL_APPS配置当前app,不然Django无法找到自定义的simple_tag
INSTALLED_APPS = [
'django.contrib.staticfiles',
'app01.apps.App01Config', # 默认是配置好了的
]
1.2 创建可识别的自定义过滤器包
在app中创建templatetags包(包名只能是templatetags,不能改)
1.3 创建py文件
在包内创建py文件,这个名字没有限制
1.4 撰写过滤器代码
from django import template #这其实只是一个接口,里面存放各种导入,没有实质代码
register = template.Library() # 在template中转站中,实例化Library类
import re # 正则 后面用到
@register.filter # 装饰器调用filter方法
def my_add(a, b):
res = a ** b
return res
@register.filter()
def my_upper(value):
if re.match('[a-z]', value):
value = value.upper() + '_Dsb' # type:str
return value
else:
return value
1.5 使用方法–和给的相同
templates下面的index模板
<tr>
<td>Name</td>
<td>Age</td>
<td>Hobby</td>
<td>Level</td>
<td>Time</td>
</tr>
{% load my_tags %} # 这里我们先要加载自定义的过滤器文件
<tr>
<td>{{'lgd'|my_upper }}</td>
<td>{{ 2|my_add:10 }}</td>
<td>送菜下饭</td>
<td>这波我再大气层</td>
<td>剑指S11</td>
</tr>
2、自定义标签
1.1 配置文件路径
在setting中的INSTALL_APPS配置当前app,不然Django无法找到自定义的simple_tag
INSTALLED_APPS = [
'django.contrib.staticfiles',
'app01.apps.App01Config', # 默认是配置好了的
]
1.2 创建可识别的自定义过滤器包
在app中创建templatetags包(包名只能是templatetags,不能改)
1.3 创建py文件
在包内创建py文件,这个名字没有限制,(与过滤器写在了一起)
1.4 撰写过滤器代码
from django import template
register = template.Library()
@register.simple_tag # 不同点
def my_csrf():
import uuid
res=uuid.uuid4()
return mark_safe('<input type="hidden" name="csrfmiddlewaretoken" value="%s">'%res)
1.5 使用
{% load my_tags %}
{% my_csrf %}
{% my_tag 1 3 4 %}
二、模板的导入和继承
1、模板的导入
1.1 新建一个xx.html文件,把写好的模板写入进去,或者找个好看的模板
!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aaa@qq.com/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<title>beautiful_base</title>
</head>
<body>
<div class="row" style="background-color: #0087ff">
<h1>Example heading <span class="label label-default">New</span></h1>
<h2>Example heading <span class="label label-primary">New</span></h2>
<h3>Example heading <span class="label label-success">New</span></h3>
<h4>Example heading <span class="label label-info">New</span></h4>
<h5>Example heading <span class="label label-warning">New</span></h5>
<h6>Example heading <span class="label label-danger">New</span></h6>
</div>
</body>
</html>
1.2 在想使用的地方
{% include ‘xxx.html ’ %}
<tr>
<td>{{'lgd'|my_upper }}</td>
<td>{{ 2|my_add:10 }}</td>
<td>送菜下饭</td>
<td>这波我再大气层</td>
<td>剑指S11</td>
</tr>
</table>
</div>
<hr class="my-4">
{% include 'beautiful_base.html' %} # 在这里导入模板
2 模板的继承
2.1 写一个母版,留一个空盒子位置
{% block top %}
{% endblock %}
<body>
<div class="row" style="background-color: #0087ff">
<h1>Example heading <span class="label label-default">New</span></h1>
<h2>Example heading <span class="label label-primary">New</span></h2>
<h3>Example heading <span class="label label-success">New</span></h3>
<h4>Example heading <span class="label label-info">New</span></h4>
<h5>Example heading <span class="label label-warning">New</span></h5>
<h6>Example heading <span class="label label-danger">New</span></h6>
</div>
{% block top %}
{% endblock %}
</body>
2.2:某个页面要使用母版,引入,扩写盒子
{% extends ‘xxx.html’ %}
{% block top %}
index页面
{% endblock %}
<body>
{% extends 'beautiful_base.html' %}
{% block footer %}
<form class="form-inline">
<h1><p>这是我新添加的表单</p></h1>
<div class="form-group">
<label for="exampleInputName2">Name</label>
<input type="text" class="form-control" id="exampleInputName2" placeholder="Jane Doe">
</div>
<div class="form-group">
<label for="exampleInputEmail2">Email</label>
<input type="email" class="form-control" id="exampleInputEmail2" placeholder="aaa@qq.com">
</div>
<button type="submit" class="btn btn-default">Send invitation</button>
</form>
{% endblock %}
</body>
三、静态文件相关
1. 第一种
配置静态文件 逐级导入
<img src="/static/img/1.jpg" style="width: 300px">
**注意:**这种方法在浏览器 无痕模式 下 会失效 一些链接无法引入
2. 第二种
注意: {% load static %}
需要放在html的头部位置(至少在使用static
标签的上面),一般都是放在html的最上面。如果{% extend %}
标签和{% load static %}
同时存在,{% extend %}
需要放在最上面,然后再放{% load static %}
等标签。
{% load static %}
<link rel="stylesheet" href="{% static 'bootstrap/css/bootstrap.min.css' %}">
3. 第三种
{% load static %}
<img src="{% get_static_prefix %}img/3.jpg" style="width: 300px">
四、inclusion_tag的使用
可以生成一片模板中的代码块
# my_tags
@register.inclusion_tag('inclusion_tag.html')
def tags():
now = datetime.datetime.now()
dic = {'Name': 'TES',
'Age': 'S10',
'Hobby': 'Heart',
'Level': 'One',
'Time': now,
'Last': 'Super'}
# 固定返回的必须是字典
print(dic)
return {'data': dic}
这是创建的与之相关的html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/aaa@qq.com/dist/css/bootstrap.min.css"
integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<title>Title</title>
</head>
<body>
<div class="row" style="background-color: #0087ff">
<h1>{{ data.Name }}<span class="label label-default">New</span></h1>
<h2>{{ data.Age }} <span class="label label-primary">New</span></h2>
<h3>{{ data.Hobby }} <span class="label label-success">New</span></h3>
<h4>{{ data.Level }} <span class="label label-info">New</span></h4>
<h5>{{ data.Time }} <span class="label label-warning">New</span></h5>
<h6>{{ data.Last }} <span class="label label-danger">New</span></h6>
</div>
</body>
</html>
使用
只能作为插入使用,不能单独使用,将装饰器使用的html文件导入到其他的模板中使用,单独使用没有效果的,像这样
{% extends 'beautiful_base.html' %}
{% load static %}
{% block footer %}
{% load my_tags %} # 已导入
<form class="form-inline">
<h1><p>这是我新添加的表单</p></h1>
<div class="form-group">
<label for="exampleInputName2">Name</label>
<input type="text" class="form-control" id="exampleInputName2" placeholder="Jane Doe">
</div>
<div class="form-group">
<label for="exampleInputEmail2">Email</label>
<input type="email" class="form-control" id="exampleInputEmail2" placeholder="aaa@qq.com">
</div>
</form>
{% tags %} # 在这里掉用
{% endblock %}
五、 字段和字段参数介绍
class Book(models.Model):
# 如果不写id,会默认一个id,并且自增
#primary_key=True 表示该字段是主键,一个表中只能由一个主键
# id = models.AutoField(primary_key=True)
# varchar类型,长度,
# 字段是否可以为空:null=True,可以为空
# 默认值:default='未知书名',如果没传,默认是它
# 设置索引:db_index=True 表示该字段是辅助索引
# 是否唯一:unique=True 表示唯一
name=models.CharField(max_length=32,null=True,default='未知书名',db_index=True,unique=True)
# float类型
# max_digits 最大长度是5 4567.5
# decimal_places=2 小数点后两位 23.56 999.99
price=models.DecimalField(max_digits=5,decimal_places=2)
# DateTimeField年月日时分秒
# auto_now=True 新增,默认使用当前时间
# auto_now_add=True 修改,设置当前时间
publish_date=models.DateTimeField(auto_now=True)
publish=models.CharField(max_length=32)
六、 单表增加
两种方式
第一种:
models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')
第二种:
book=models.Book(name='yyy',price=11.34,publish='南京出版社')
book.save()
七、 单表查询(开个头)
# 查询名字叫xxx的书
from app01 import models
def books(request):
# models.Book.objects.create(name='xxx',price=10.34,publish='南京出版社')
#
#
# book=models.Book(name='yyy',price=11.34,publish='南京出版社')
# book.save()
# 查询所有
res=models.Book.objects.all()
print(res)
# 查询名字叫xxx的书(是个列表:QuerySet)
res = models.Book.objects.filter(name='xxx')
res = models.Book.objects.filter(name='xxx')[0]
res = models.Book.objects.filter(name='xxx').first()
# 查询名字叫xxx的书(就是book对象),如果没有或者由多个,都报错
# 查询结果必须有且仅有一个才正常,否则报错
res=models.Book.objects.get(name='sss')
#
print(res.name)
return HttpResponse('两本书保存成功')
上一篇: 第十一天
下一篇: 面试、请假等职场小笑话
推荐阅读