模版语法、过滤器、for循环、if判断、模板的的继承与导入

模版语法传值

传值

def index(request):
    # 模板语法可以传递给前端的数据类型
    n = 123
    f = 12.1
    s = '俺也想网恋'
    b = True
    l = ['小红', '小花', '小敏', '小倩']
    d = {'name': 'jason', 'age': 18, 'info': '这个人有点机车啊'}
    # d = {'name': 'jason', 'hobby': [1, 2, 3, {'info': 'NB'}]}
    t = (1, 2, 3, 4)
    se = {'静静', '芊芊', '洋洋'}
    def func():
        return '我是func函数'
    class Student(object):
        def get_self(self):
            return 'self'
        @staticmethod
        def get_func():
            return 'func'
        @classmethod
        def get_class(cls):
            return 'class'
    obj = Student()
    return render(request, 'index.html', locals())

image

取值

# django模版语法的取值 是固定的格式 只能采用“句点符” .
<p>{{ d.username }}</p>
<p>{{ l.0 }}</p>
<p>{{ d.hobby.3.info }}</p>
# 既可以点键也可以点索引 还可以两者混用

image

过滤器

过滤器只能最多有两个参数

基本语法:

{{数据 | 过滤器 : 参数}}

关键字 作用
length 统计长度
default 默认值
fileszeformat 格式化文件的大小
date: 'Y-m-d H:i:s' 日期格式化
slice 切片操作(支持步长)
truncatechar 切取字符(包含三个点)
truncatewords 切取单词(不包含三个点,按照空格切)
cut 移除指定字符
join 指定字符拼接
add 数字的加减运算或字符串拼接
safe 转义(可以实现后端写前端代码)

image

标签(for循环与if判断)

for循环

# for循环
	{% for foo in l %}
    <p>{{ foo }}</p>  一个个元素
	{% endfor %}

image

forloop

image

for循环处理字典

{% for key in d.keys %}
    <p>{{ key }}</p>
{% endfor %}

{% for value in d.values %}
    <p>{{ value }}</p>
{% endfor %}

{% for item in d.items %}
    <p>{{ item }}</p>
{% endfor %}

image

if判断

{% if b %}
    <p>baby</p>
{% elif c %}
	<p>小baby</p>
{% else %}
    <p>老baby</p>
{% endif %}

image

for循环嵌套if

{% for foo in l %}
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last %}
        <p>这是我的最后的波纹了JOJO</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}

image

image

with起别名

{% with dic.hobby.3.info as nb %}
    <p>{{ nb }}</p>
{% endwith %}

image

自定义过滤器、标签、inclusion_tag

使用上述三个方法都需要执行以下步骤

"""
先三步走
	1.在应用下创建一个名字”必须“叫templatetags文件夹
	2.在该文件夹内创建“任意”名称的py文件 eg:mytag.py
	3.在该py文件内"必须"先书写下面两句话(单词一个都不能错)
		from django import template
		
		register = template.Library()
"""

自定义过滤器

最多有两个参数

在 mytag.py里
# 自定义过滤器
@register.filter(name='func')  # func是定义的过滤器名
def my_sum(a, b):  # 最多有两个参数
    c = a + b
    return c
# 使用
{% load mytag %}
<p>{{ n|func:f }}</p>

image

自定义标签

在 mytag.py里
# 自定义标签(可以有很多参数)
@register.simple_tag(name='plus')
def index(a, b, c, d):
    return f'{a}-{b}-{c}-{d}'
# 使用
{% load mytag %}
<p>{% plus 'jason' 123 321 111 %}</p>  # 标签多个参数彼此之间空格隔开

image

自定义inclusion_tag

在 mytag.py里
# 自定义inclusion_tag
@register.inclusion_tag('list.html')
def run(n):
    data = ['第%s项' % i for i in range(n)]
    return locals()
# 在list.html页面
<ul>
    {% for i in data %}
        <li>{{ i }}</li>
    {% endfor %}
</ul>

# 使用
{% load mytag %}
{% run 5 %}

image

模版的继承

作用: 可以把页面的固定一块区域按照设计来改变,其他位置不影响

1.首先选好要继承的主页面,在子页面的html文件里写入以下代码
{% extends 'home.html' %}  # 表示该子页面继承了主页面home.html,此时子页面打开和主页面一模一样

image

2.去主页面选定划分要修改的区域 # 可以划分多个区域
{% block xxx %}
	模版内容
{% endblock %}

image

3.子页面声明修改哪部分区域
{% block xxx %}
	子页面内容
{% endblock %}

image

效果:

image

# 一般情况下模版页面上应该至少有三块可以被修改的区域
  1.css区域
  2.html区域
  3.js区域
  {% block css %}  # 在主页面的head标签内占位

	{% endblock %}
  
  {% block content %}

	{% endblock %}
  
  {% block js %}  # 在主页面的最下面占位

	{% endblock %}
  # 每一个子页面就都可以有自己独有的css代码 html代码 js代码
  
"""
一般情况下 模版的页面上划定的区域越多 那么该模版的扩展性就越高
但是如果太多 那还不如自己直接写
"""

模版的导入

"""
将页面的某一个局部当成模块的形式
哪个地方需要就可以直接导入使用即可
"""
{% include 'wasai.html' %}

image

posted @ 2022-03-02 15:45  zong涵  阅读(110)  评论(0编辑  收藏  举报