模板、模板语法的过滤器、标签、自定义方法、数据库迁移命令
今日学习内容总结
模板语法
模板语法之过滤器
过滤器说明
1. 类似于Python的内置方法
2. 将竖杠左侧的数据当做第一个参数传给右边的过滤器
3. 语法 : {{ [数据]|过滤器:可选参数 }}
4. 注意 : 竖杠左右两边没有空格
5. 过滤器参数包含空格的话需要使用引号包裹
6. 过滤器最多只能有两个参数
语法结构
{{ 数据对象|过滤器名称:参数 }} 过滤器最多只能额外传输一个参数
常用过滤器使用
django模板语法提供了60+过滤器,我们了解常用过滤器就可以了。
<p>统计数据的长度:{{ s1|length }}</p>
<p>算术加法或者字符串加法:{{ n1|add:111 }}、{{ s1|add:'big baby' }}</p>
<p>将数字转成合适的文件计量单位:{{ file_size|filesizeformat }}、{{ file_size1|filesizeformat }}</p>
<p>判断当前数据对象对应的布尔值是否是False:{{ b|default:'前面的值对应的布尔值是False' }}、{{ s1|default:'前面的值对应的布尔值是False' }}</p>
<p>时间格式化:{{ ctime|date:'Y-m-d' }}</p>
<p>索引切片:{{ s1|slice:'0:8' }}</p>
<p>按照空格截取指定个数的文本:{{ s2|truncatewords:5 }}、{{ s1|truncatewords:1 }}</p>
<p>按照字符个数截取文本(包含三个点):{{ s2|truncatechars:5 }}、{{ s1|truncatechars:10 }}</p>
<p>移除指定的字符:{{ info|cut:'|' }}</p>
<p>是否取消转换:{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</p>
最后一个|safe启发了我们以后用django开发全栈项目前端页面代码(主要指HTML代码)也可以在后端编写:
from django.utils.safestring import mark_safe
html_safe = mark_safe('<h1>你好</h1>')
模板语法之标签
在django模板语法中写标签的时候,可以只写关键字然后tab键就会自动补全。
语法结构
{% 名字 ...%}
{% end名字 %}
if判断
{% if 条件1 %}
<p>你好啊</p>
{% elif 条件2 %}
<p>他好呀</p>
{% else %}
<p>大家好</p>
{% endif %}
for循环
提供了forloop关键字
{% for i in l %}
<p>{{ forloop }}</p>
<p>{{ i }}</p> # 循环从列表 l 中取出一个个元素
{% endfor %}
# forloop 输出的是
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
counter0 索引
counter 第一个元素
revcounter 倒序第一个元素
revcounter0 倒序索引
first 是否是第一个元素
last 是否是最后一个元素
for与if混合使用
{% for i in l %}
{% if forloop.first %}
<p>is first</p>
{% elif forloop.last %}
<p>is last</p>
{% else %}
<p>{{ i }}</p>
{% endif %}
{% endfor %}
with : 取别名
{% with ll.2.hobby.0 as hb %}
<p>{{ hb }}</p> # 可以使用别名取值
<p>{{ ll.2.hobby.0 }}</p> # 也可以使用原来的方式取值
{% endwith %}
字典values、keys、items方法
{% for k in d.keys %}
<p>{{ k }}</p>
{% endfor %}
{% for v in d.values %}
<p>{{ v }}</p>
{% endfor %}
{% for kv in d.items %}
<p>{{ kv }}</p>
{% endfor %}
自定义过滤器、标签、inclusion_tag
创建 templatetags 文件
1. 首先在应用下创建一个名字必须叫"templatetags"文件夹
2. 在改文件夹下创建一个任意名称的 py 文件 (例 : mytag)
3. 在该 py 文件内固定书写两行代码
from django import template
register = template.Library()
自定义过滤器
自定义过滤器最多只能有两个形参。
from .templatetags.mytag import register
# 在模板层导入自定义的过滤器时使用的是这里指定的名字
@register.filter(name='myfilter')
def sums(a, b): # 函数名随便起什么
return a + b # 返回两个参数的和
{% load mytag %} # 导入tag文件
<p>{{ i|myfilter:100 }}</p> # 使用myfilter过滤器
自定义标签
自定义标签可以接收任意的参数。
from .templatetags.mytag import register
# 在模板层导入自定义的标签时使用的是这里指定的名字
@register.simple_tag(name="my_tag")
def my_join(a,b,c,d): # 函数名任意
return f'{a}/{b}/{c}/{d}' # 返回参数拼接后的结果
{% load mytag %} # 导入tag文件
<p>{% my_tag 'hello' 'pai' 'da' 'xing' %}</p> # 标签之后的多个参数彼此之间用空格隔开
# 自定义inclusion_tag
from .templatetags.mytag import register
@register.inclusion_tag('test.html',name='my_incl_tag') # 第一个参数是需要渲染的HTML页面
def func(n):
data=[]
for i in range(n):
data.append(f'第{i}页')
return locals()
# test.html 文件
{% load mytag %}
<p>{% my_incl_tag 6 %}</p>
# test2.html
{{ data }}
{% for foo in data %}
{% if forloop.first %}
<p>{{foo}}</p>
{% elif forloop.last %}
<p>{{ foo }}</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
该方法需要先作用于一个局部html页面,之后将渲染的结果放到调用的位置。内部原理:
1. 在HTML页面中导入写好的 inclusion_tag 并调用了
2. 触发了py文件中一个函数的执行并产生结果
3. 产生的结果通过模板语法传递给一个HTML页面进行渲染
4. 渲染完毕后又返回调用 inclusion_tag 的位置
test.html 页面中调用了 inclusion_tag----->触发执行了一个函数产生结果并渲染到 test2.html 页面中, 渲染完又返回 test.html 页面。
模板
模板的导入
类似于将html页面上的局部页面做成模块的形式 ,哪个地方想要直接导入即可展示。
{% include 'edit.html' %} # 直接在当前HTML文件里面显示 edit.html 文件的内容
<!----> 是HTML的注释语法
{##} 是django模板语法的注释
HTML的注释可以在前端浏览器页面上直接查看到
模板语法的注释只能在后端查看 前端浏览器查看不了
模板的继承
模板继承的使用
模板的继承首先需要选择一个模板页面, 在该页面里面使用 block 划定可以被更改的区域:
# 母板页面 'home.html' 文件
{% block [区域名称] %}
......
{% endblock %}
想要继承的页面可以使用 extends 来继承某一个页面。
# 子版
{% extends 'home.html' %}
{% block [区域名称] %}
......
{% endblock %}
子版继承了模板, 那么子版的整体格式与模板一样, 被 block 划分了的区域可以自己随意更改。
子页面还可以重复使用父页面的内容。
{{ block.super }}
模板的三个区域
模板上最少应该有三个区域:
{% block css %}
# css区域
{% endblock %}
{% block content %}
# HTML区域
{% endblock %}
{% block js %}
# js区域
{% endblock %}
目的是为了让子版具有独立的css、js等,增加扩展性。
数据库迁移命令
1.数据库正向迁移命令(将类操作映射到表中)
python3 manage.py makemigrations
python3 manage.py migrate
2.数据库反向迁移命令(将表映射成类)
python3 manage.py inspectdb
主要用于操作已经存在的表,将映射出来的类写入models.py即可。
测试环境搭建
当我们只想操作orm,不想使用网络请求时,需要有专门的测试环境。
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
import django
django.setup()
2.pycharm提供
python console

学习内容总结
浙公网安备 33010602011771号