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)

posted @ 2022-05-16 22:18  一梦便是数千载  阅读(30)  评论(0编辑  收藏  举报