Django模板层

Posted on 2022-11-27 21:37  呱呱呱呱叽里呱啦  阅读(15)  评论(0编辑  收藏  举报

Django模板层

模板语法传值

# 模板语法形式:1.{{ 变量相关 }} 2.{% 逻辑相关 %}
# 模板语法可以传递的后端数据类型
# 包括基本数据类型、函数(自动加括号执行,并传递返回值,不支持传参)、类(自动实例化)、对象(可以调用对象自动传参或者无参方法 eg:__str__(self))
# 原则,先判断接收的变量名是否可以添加'()'调用,能调用就调用。

# django模板语法的取值,只能使用'.'取值,固定格式
'''
<p>{{ dict1.key1 }}</p>
<p>{{ list1.index1 }}</p>
<p>{{ dict1.key1.index1.keyx }}</p>
'''
# 可以'.'键'.'索引或者混用

过滤器

# 即模板语法内置方法
# 基本语法:{{ 数据|过滤器:参数 }}
s = 'abc'
<p>{{ s|lenth }}</p> # 统计长度,即 <p>3</p>
<p>{{ n|default:'空' }}</p> # 默认值,当n为True,就传递n的值,否则传递default值
<p>{{ file_size|filesizeformat }}</p> # 传递格式化后的文件大小
<p>{{ current_time|date:'Y-m-d H:i:s' }}</p> # 传递格式化后的时间
<p>{{ l|slice:'0:4:2' }}</p> # 传递切片
<p>{{ info|truncatechars:9 }}</p> # 传递截取后的字符,效果:123456...
<p>{{ info|truncatewords:3 }}</p> # word1 word2 word3...(长度不含...,而且切取依据是空格)
<p>{{ info|cut:' ' }}</p> # 传递移除' '之后的字符
<p>{{ list1|join:'$' }}</p> # 传递用'$'连接各元素后的字符串
<p>{{ n|add:2 }}</p> # 传递n+1
<p>{{ s|add:info }}</p> # 传递s+info
<p>{{ h1|safe }}</p> # 取消转义
# 后端取消转义
html_code = '<h1>ahhahahahah</h1>'
h2 = mark_safe(html_code)

标签

# for循环
'''
{% for li in list1 %}
        {{ forloop }}
{% endfor %}
'''
'''
{% for li in list1 %}
        <p>{{ li }}</p>
{% endfor %}
'''
# if判断
'''
{% if bllo1 %}
    <p>hahahah</p>
{% elif %}
    <p>wahahahahahha</p>
{% else %}
    <p>xixiixixxiix</p>
{% endif %}
'''

# for + if
'''
{% for li in list %}
    {% if forloop.first %}
        <p>第一次循环</p>
    {% elif forloop.last %}
        <p>最后一次循环</p>
    {% else %}
        <p>{{ li }}</p>
    {% endif %}

    {% empty %}
        <p>for循环的对象是空</p>
{% endfor %}
'''

'''
{% for foo in dict1.keys/.values/.items %}
        {{ forloop }}
{% endfor %}
'''

# with语法
'''
{% with dict1.key2.index1.keyx as s %}
        <p>s</p>
        <p>s</p>
        <p>s</p>
        <p>s</p>
        <p>s</p>
        <p>s</p>
{% endwith %}
'''

自定义过滤器、标签、inclusion_tag

'''
1.在应用下创建一个templatetags文件夹
2.在该文件夹内创建任意名称的py文件 eg: mytag.py
3.在该py文件内:
from django import template
register = template.Library()

'''

# 自定义过滤器(最多两个参数)
@register.filter(name='sum_filter')
def my_sum(a1,a2):
    return a1 + a2
# 自定义过滤器调用
{% load mytag %}
<p>{{ a1|sum_filter:a2 }}</p>


# 自定义标签(可以有多个参数)
@register.simple_tag(name='my_tag')
def index(a, b, c, d):
    return f'{a}/{b}/{c}/{d}'

# 自定义标签的调用
{% load mytag %}
<p>{% my_tag 'a' 'b' 'c' 'd' %}</p>


# 自定义inclusion_tag
@register.inclusion_tag('left_menu.html')
def left(n):
    data = [f'第{i}项' for i in range(n)]
    return locals() #将data传递给left_menu.html 即 return {'data':data}
# 定义渲染工具页面 left_menu.html
'''
<ul>
    {% for datum in data %}
        <li>{{ datum }}</li>
    {% endfor %}
</ul>
'''
# 自定义inclusion_tag调用
{% load mytag %}
{% left 9 %}

模板的继承

# 模板页面设置
'''
<div class="panel-body">

{% block var_content %}
    <div class="jumbotron">
      <h1>Hello, world!</h1>
      <p>...</p>
      <p><a class="btn btn-primary btn-lg" href="#" role="button">Learn more</a></p>
    </div>
{% endblock %}

</div>
'''

# 实例页面
'''
{% extends 'home.html' %}

{% block var_content %}
    <h1>注册页面</h1>
{% endblock %}
'''

# 一般情况下,模板页面应该至少有三块可以被修改的区域
'''
1.css区域
{% block css %}
{% endblock %}
2.html区域
{% block content %}
{% endblock %}
3.js区域
{% block js %}
{% endblock %}
'''

模板的导入

# 即将模板页面模块化,然后实例页面直接使用语法将模板页面所有代码直接导入
{% include 'part.html' %}