Django模板层


目录
  • 模板语法之过滤器
    • 语法结构
    • 常见过滤器
    • 统计数据的长度
    • 算术加法或者字符串加法
    • 将数字转成合适的文件计量单位
    • 判断当前数据对象对应的布尔值是否为False
    • 时间格式化
    • 索引切片
    • 按照空格截取指定个数的文本
    • 按照字符个数截取文本
    • 移除指定的字符
    • 是否取消转换
  • 模板语法之标签
    • 语法结构
    • if判断
    • for循环
      • forloop关键字
    • for+if混合使用
  • 自定义过滤器、标签、inclusion_tag
    • 自定义过滤器
    • 自定义标签
    • 自定义inclusion_tag
  • 模板的导入
    • 导入方法
  • 模板的继承
    • 先在模板中通过block划定能够修改的区域
    • 子页面继承模板
    • 修改划定的区域
    • 子页面重复调用继承模板的内容
  • 测试环境搭建
  • ORM关键字使用

模板语法之过滤器

类似于内置函数,使用的时候多看源码

语法结构

{{ 数据对象|过滤器名称:参数 }} 过滤器只能额外传输一个参数

常见过滤器

django模板语法提供了60+过滤器,我们只需了解一些常用的过滤器

def test(request):
    l1 = [111, 222, 333, 444, 555, 666]
    n1 = 666
    file_size1 = 1024
    file_size2 = 10241024
    dic = {'name': 'johnson', 'age': 22, 'nationality': 'Uk'}
    s1 = 'django unstoppable!'
    s2 = 'stephanie'
    s3 = 'my name is tom my age is 22'
    s4 = 'username^password'
    b1 = False
    tag1 = '

我是二级标题

' script1 = "" html1 = "" from django.utils.safestring import mark_safe res = mark_safe(html1) from _datetime import datetime current_time = 20220328 return render(request, 'test.html', locals())

统计数据的长度

{{ s1|length }}

算术加法或者字符串加法

{{ n1|add:222 }}、{{ s1|add:'awesome' }}、{{ b1|add:'female' }}

将数字转成合适的文件计量单位

{{ file_size1|filesizeformat }}、{{ file_size2|filesizeformat }}

判断当前数据对象对应的布尔值是否为False

{{ s2|default:'第一个值对应的布尔值是False' }}、{{ b1|default:'第一个值对应的布尔值是False' }}

时间格式化

{{ current_time|date:'Y-m-d' }}

索引切片

{{ s1|slice:'0:12' }}
{{ s2|slice:'2:6' }}

按照空格截取指定个数的文本

{{ s3|truncatewords:3 }}、{{ s1|truncatewords:1 }}

按照字符个数截取文本

注意:包含三个点

{{ s2|truncatechars:10 }}、{{ s3|truncatechars:10 }}

移除指定的字符

{{ s4|cut:'^' }}

是否取消转换

{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}

注意:safe提供了django开发全栈项目前端页面代码(主要是HTML代码)可以在后端编写的方法

模板语法之标签

语法结构

{% 关键字 ...%}
{% end关键字 %}

if判断


{% if b1 %}
if条件成立
{% elif l1 %}
elif条件成立
{% else %}
上述条件均不成立
{% endif %}

点击查看效果图

for循环

forloop关键字

{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}

{% for foo in l1 %}
{{ foo }}
{% endfor %}
{% for foo1 in dic %}
{{ foo1}}
{% endfor %}
{% for foo in l1 %} {% if forloop.first %}
这是第一次循环
{% endif %} {% if forloop.last %}
这是最后一次循环
{% endif %}
{{ foo }}
{% endfor %}

for+if混合使用

{% for foo in l1 %}
{{ foo }}
{% if forloop.first %}
这是第一次循环
{% endif %} {% if forloop.last %}
这是最后一次循环
{% else %}
这是中间循环
{% endif %} {% empty %}
循环对象为空
{% endfor %}

# 针对字典django模板语法同样提供了keys、values、items方法
{% for foo in dic.keys %}

{{ foo }}

{% endfor %} {% for foo1 in dic.values %}

{{ foo1 }}

{% endfor %} {% for foo2 in dic.items %}

{{ foo2 }}

{% endfor %}

自定义过滤器、标签、inclusion_tag

自定义过滤器

只能接收两个参数

@register.filter(is_safe=True)
def func(x, y):
    return x+y

{% load custom_tag %} {{ n1|func:333 }}

点击查看效果图

自定义标签

可以接收任意的参数

@register.simple_tag(name='customize_tag')
def func1(a, b, c, d, e, f, g):
    return a + b + c + d + e + f + g
{% load custom_tag %} {% customize_tag 11 22 33 44 55 66 77 %}

点击查看效果图

自定义inclusion_tag

@register.inclusion_tag('custom_inclusion_tag.html')
def func2(n):
    l1 = []
    for i in range(1, n + 1):
        l1.append(f'第{i}页')
    return locals()
# custom_inclusion_tag.html
    {% for foo in l1 %}
  • {{ foo }}
  • {% endfor %}

点击查看效果图

模板的导入

导入方法

{% include 'base.html' %}

模板的继承

类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的数据和功能

先在模板中通过block划定能够修改的区域

	{% block content %}
  	

主页内容

{% endblock %} {% block css %} {% endblock %} {% block js %} {% endblock %}

子页面继承模板

{% extends 'base.html' %}

修改划定的区域

{% block content %}

登陆页面

用户名

密码


{% endblock %}

子页面重复调用继承模板的内容

{% block content %}
    {{ block.super }}

登陆页面

用户名

密码


{% endblock %} {% block js %} {% endblock %}

注意:模板上最少应该有三个区域
css区域、内容区域、js区域
子页面才能有有自己专属的css、js、内容

测试环境搭建

class UserInfo(models.Model):
    uid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=42)
    gender = models.CharField(max_length=12)
    age = models.IntegerField(max_length=3)
    register_time = models.DateField(auto_now=True)

    # 对象被执行打印操作自动触发
    def __str__(self):
        return '对象:%s' % self.name
# 测试代码
from django.test import TestCase

# Create your tests here.
import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day54.settings")
    import django

    django.setup()
    from app01 import models

    models.UserInfo.objects.create(name='linda', age=22, gender='female')
    models.UserInfo.objects.create(name='tom', age=24, gender='male')
    models.UserInfo.objects.create(name='sam', age=20, gender='female')
    models.UserInfo.objects.create(name='david', age=22, gender='male')
    models.UserInfo.objects.create(name='jobs', age=24, gender='male')
    models.UserInfo.objects.create(name='july', age=20, gender='female')

ORM关键字使用

# query = models.UserInfo.objects.all()  # 查询所有的数据
# query = models.UserInfo.objects.filter()  # 括号内填写筛选条件,参数为空相当于all()
# query = models.UserInfo.objects.filter(pk=2)  # pk字段自动定位到当前表的主键字段
# query = models.UserInfo.objects.filter(pk=3)[0]  # 直接获取数据对象
# query = models.UserInfo.objects.filter(pk=4).first()  # 获取结果集中第一个对象
# query = models.UserInfo.objects.filter(pk=5, name='sam').first()  # 括号内支持填写多个筛选条件,默认是and关系
# query = models.UserInfo.objects.filter().filter().filter().filter()  # 类似于jQuery链式操作
# query = models.UserInfo.objects.filter().last()  # 获取结果集中最后一个对象

# query = models.UserInfo.objects.all().values('name', 'gender')  # QuerySet 可当作是列表套字典
# query = models.UserInfo.objects.values('name', 'gender')  # 指定字段all为空也表示查询所以数据
# query = models.UserInfo.objects.filter(pk=2).values('name')  # 可当作是对结果集进行字段的筛选
# query = models.UserInfo.objects.all().values_list('name', 'age')  # QuerySet 可当作是列表套元组
# query = models.UserInfo.objects.all().distinct()  # 数据对象中如果包含主键不能去重
# query = models.UserInfo.objects.values('name').distinct()
# query = models.UserInfo.objects.order_by('age')  # 默认是升序
# query = models.UserInfo.objects.order_by('-age')  # 该为降序
# query = models.UserInfo.objects.order_by('age', 'pk')  # 支持多个字段依次排序
# query = models.UserInfo.objects.exclude(gender='male')  # 取反操作

# query = models.UserInfo.objects.reverse()  # 没有效果
# query = models.UserInfo.objects.order_by('age').reverse()  # 只有在order_by排序之后才可以
# query = models.UserInfo.objects.order_by('age')
# query = models.UserInfo.objects.count()  # 统计结果集的个数
# query = models.UserInfo.objects.exists()
# query = models.UserInfo.objects.filter(name='trump').exists()  # 判断结果集中是否有数据,返回布尔值
# query = models.UserInfo.objects.get(pk=2)  # 直接获取数据对象,找不到会报错
# query = models.UserInfo.objects.get(pk=7)  # 不存在直接报错
# query = models.UserInfo.objects.filter(pk=1)  # 获取数据对象,找不到返回空列表
# query = models.UserInfo.objects.filter(pk=7)  # 不存在返回空列表
# print(query)