Django模板层
目录
模板语法之过滤器
类似于内置函数,使用的时候多看源码
语法结构
{{ 数据对象|过滤器名称:参数 }} 过滤器只能额外传输一个参数
常见过滤器
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 = '<h2>我是二级标题</h2>'
script1 = "<script>confirm('are you sure')</script>"
html1 = "<script>prompt('are you OK')</script>"
from django.utils.safestring import mark_safe
res = mark_safe(html1)
from _datetime import datetime
current_time = 20220328
return render(request, 'test.html', locals())
统计数据的长度
<div>{{ s1|length }}</div>
算术加法或者字符串加法
<div>{{ n1|add:222 }}、{{ s1|add:'awesome' }}、{{ b1|add:'female' }}</div>
将数字转成合适的文件计量单位
<div>{{ file_size1|filesizeformat }}、{{ file_size2|filesizeformat }}</div>
判断当前数据对象对应的布尔值是否为False
<div>{{ s2|default:'第一个值对应的布尔值是False' }}、{{ b1|default:'第一个值对应的布尔值是False' }}</div>
时间格式化
<div>{{ current_time|date:'Y-m-d' }}</div>
索引切片
<div>{{ s1|slice:'0:12' }}</div><div>{{ s2|slice:'2:6' }}</div>
按照空格截取指定个数的文本
<div>{{ s3|truncatewords:3 }}、{{ s1|truncatewords:1 }}</div>
按照字符个数截取文本
注意:包含三个点
<div>{{ s2|truncatechars:10 }}、{{ s3|truncatechars:10 }}</div>
移除指定的字符
<div>{{ s4|cut:'^' }}</div>
是否取消转换
<div>{{ tag1 }}、{{ tag1|safe }}、{{ scripts1|safe }}、{{ res }}</div>
注意:safe提供了django开发全栈项目前端页面代码(主要是HTML代码)可以在后端编写的方法
模板语法之标签
语法结构
{% 关键字 ...%}
{% end关键字 %}
if判断
<br>
{% if b1 %}
<div>if条件成立</div>
{% elif l1 %}
<div>elif条件成立</div>
{% else %}
<div>上述条件均不成立</div>
{% endif %}
<br>
for循环
forloop关键字
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}
<br>
{% for foo in l1 %}
<div>{{ foo }}</div>
{% endfor %}
<br>
{% for foo1 in dic %}
<div>{{ foo1}}</div>
{% endfor %}
<br>
{% for foo in l1 %}
{% if forloop.first %}
<div>这是第一次循环</div>
{% endif %}
{% if forloop.last %}
<div>这是最后一次循环</div>
{% endif %}
<div>{{ foo }}</div>
{% endfor %}
<br>
for+if混合使用
{% for foo in l1 %}
<div>{{ foo }}</div>
{% if forloop.first %}
<div>这是第一次循环</div>
{% endif %}
{% if forloop.last %}
<div>这是最后一次循环</div>
{% else %}
<div>这是中间循环</div>
{% endif %}
{% empty %}
<div>循环对象为空</div>
{% endfor %}
<br>
# 针对字典django模板语法同样提供了keys、values、items方法
{% for foo in dic.keys %}
<p> {{ foo }}</p>
{% endfor %}
{% for foo1 in dic.values %}
<p>{{ foo1 }}</p>
{% endfor %}
{% for foo2 in dic.items %}
<p>{{ foo2 }}</p>
{% endfor %}
<br>
自定义过滤器、标签、inclusion_tag
自定义过滤器
只能接收两个参数
@register.filter(is_safe=True)
def func(x, y):
return x+y
<br>
<div>
{% load custom_tag %}
{{ n1|func:333 }}
</div>
<br>
自定义标签
可以接收任意的参数
@register.simple_tag(name='customize_tag')
def func1(a, b, c, d, e, f, g):
return a + b + c + d + e + f + g
<div>
{% load custom_tag %}
{% customize_tag 11 22 33 44 55 66 77 %}
</div>
自定义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
<ul>
{% for foo in l1 %}
<li>
{{ foo }}
</li>
{% endfor %}
</ul>
模板的导入
导入方法
{% include 'base.html' %}
模板的继承
类似于面向对象的继承:继承了某个页面就可以使用该页面上所有的数据和功能
先在模板中通过block划定能够修改的区域
{% block content %}
<h1>主页内容</h1>
{% endblock %}
{% block css %}
<style>
.container {
background: rgb(154,190,224)
}
</style>
{% endblock %}
{% block js %}
<script>
prompt('are you OK')
</script>
{% endblock %}
子页面继承模板
{% extends 'base.html' %}
修改划定的区域
{% block content %}
<div class="container" style="background: rgb(154,190,224)">
<div class="row" >
<h1 style="text-align: center">登陆页面</h1>
<div class="col-md-8 col-md-offset-2" >
<form action="" method="post" >
<p>用户名<input type="text" name="username" required="required" class="form-control"></p>
<p>密码<input type="password" name="password" required="required" class="form-control"></p>
<p>
<input type="submit" value="登陆" class="btn btn-block btn-info">
</p>
</form>
<br>
</div>
</div>
</div>
{% endblock %}
子页面重复调用继承模板的内容
{% block content %}
{{ block.super }}
<div class="container" >
<div class="row" >
<h1 style="text-align: center">登陆页面</h1>
<div class="col-md-8 col-md-offset-2" >
<form action="" method="post" >
<p>用户名<input type="text" name="username" required="required" class="form-control"></p>
<p>密码<input type="password" name="password" required="required" class="form-control"></p>
<p>
<input type="submit" value="登陆" class="btn btn-block btn-info">
</p>
</form>
<br>
</div>
</div>
</div>
{% endblock %}
{% block js %}
<script>
{#prompt('are you OK')#}
</script>
{% 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)