week11 day6 模板层

一、模板语法

{{   }}:变量相关
{%   %}:逻辑相关

views.py:

def hhh(request):
    # 模板语法可以传递给后端python数据类型
    # n = 123
    # f = 2.33
    # s = 'wdnmd'
    # l = [1,2,3]
    # d = {'name':'mbd', 'age':36}
    # t = (1, 2, 3)
    # se = {1, 3, 5, 6}
    ddd = {'name': 'mbd', 'hobby': ['basket', 'foot', {'pigu': 'big', 'ding': 'qiao'}]}

    def func():
        print(123)
        return 'wdnmd'

    class Teacher:
        def say(self):
            return 'saying'
        def eat(self):
            return 'eating'
    obj = Teacher()

    return render(request, 'hhh.html', locals())

html页面:

{#    <p>{{ n }}</p>#}
{#    <p>{{ f }}</p>#}
{#    <p>{{ s }}</p>#}
{#    <p>{{ l }}</p>#}
{#    <p>{{ t }}</p>#}
{#    <p>{{ d }}</p>#}
{#    <p>{{ se }}</p>#}

# django模板语法的取值,是固定的格式,只能采用句点.调用值或者索引
<p>{{ ddd.hobby.2.pigu }}</p>
<p>传递函数名会自动加括号调用,但是模板语法不支持给函数传额外的参数:{{ func }}</p>
<p>传递类名会自动加括号实例化对象,返回对象{{ Teacher }}</p>
<p>内部能够自动判断出当前的变量名是否可以加括号调用,如果可以就自动执行,针对的是函数名和类名</p>
<p>{{ obj }}</p>
<p>{{ obj.say }}</p>
<p>{{ obj.eat }}</p>

内部能够自动判断出当前的变量名是否可以加括号调用,如果可以就自动执行,针对的是函数名和类名

二、filter过滤器

过滤器就是类似于模板语法内置的,内置方法。

django内置有60多个过滤器,我们不需要这么多,了解十个左右就差不多了,后面碰到了再去记忆。

基本语法:

{{ 数据 | 过滤器:参数}}
{#  把数字按照文件大小转换出来   #}
    <p>{{ file_size|filesizeformat }}</p>
    <p>{{ s|length }}</p>
    <p>{{ s|default:"666"  }}</p>
    <p>{{ date|date }}</p>
{#  转换时间格式   #}
    <p>{{ s|slice:'0:4:2' }}</p>
{#  可以用于展示文章摘要  #}
    <p>{{ l|truncatechars:9 }}</p>
{#  按照空格提取文章中的单词    #}
    <p>{{ l|truncatewords:3 }}</p>
{#  移除    #}
    <p>{{ s|cut:'D' }}</p>
{#  拼接    #}
    <p>{{ s|join:' ' }}</p>
{#  加法  适用于整形或者字符串  #}
    <p>{{ n|add:23456 }}</p>

三、标签

<h1>标签</h1>
{% for foo in ddd %}
    <p>{{ forloop }}</p>
{% endfor %}

在这里插入图片描述
if流程控制

{% if 0 %}
    <p>baby</p>
{% elif 0 %}
    <p>no</p>
{% else %}
    <p>yes</p>


{% for foo in l %}
    {% if forloop.first %}
        <p>这是我的第一次啊</p>
    {% elif forloop.last %}
        <p>这是最后一次了</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
        <p>for循环的可迭代对象内部没有元素,根本没法循环</p>
{% endfor %}


# 对于字典,是可以像后端一样.keys,.values,.items
{% for foo in ddd.keys %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in ddd.values %}
    <p>{{ foo }}</p>
{% endfor %}

{% for foo in ddd.items %}
    <p>{{ foo }}</p>
{% endfor %}


# with起别名
{% with ddd.hobby.2.pigu as m %}
    {{ m }}
    {{ m }}
{% endwith %}

四、自定义过滤器、标签、inclusion_tag

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

在这里插入图片描述
在这里插入图片描述

  1. 自定义过滤器的定义:

    # 自定义过滤器(参数最多有两个)
    @register.filter(name='baby')
    def func1(a, b):
        return a + b
    

    自定义过滤器的使用:

    <h1>自定义的使用</h1>
    {% load tag %}
        <p>{{ n|baby:123 }}</p>
    
  2. 自定义标签的定义:

    类似于自定义函数

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

    自定义标签的使用:

    {% load tag %}
        <p>{% plus 'jjj' 111 2223333 444 %}</p>
    
  3. 自定义inclusion_tag
    在这里插入图片描述

    """
    内部原理:
    	先定义一个方法
    	在页面上调用该方法,并且可以传值
    	该方法会生成一些数据然后传递给一个html页面
    	之后将渲染好的结果放到调用位置
    """
    

    定义:

    # templatetags文件夹下任意命名.py文件内书写的内容
    
    # 自定义inclusion_tag
    @register.inclusion_tag('process.html', name='process')
    def func3(n):
        data_list = [f'第{i}项' for i in range(1, n+1)]
        return locals()
    
    # 调用时局部处理数据的process.html页面
    <ul>
    {% for foo in data_list %}
        <li>{{ foo }}</li>
    {% endfor %}
    </ul>
    

    自定义inclusion_tag的使用:

    # 调用页面的调用方法
    
    {% load tag %}
        <p>{% process 5 %}</p>
        <p>{% process 9 %}</p>
    

    总结:当html页面偶一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面都需要使用到该局部,那么就考虑将该页面做成inclusion_tag形式。

五、模板的继承

在某一些环境下,网页的整体页面大差不差,在跳转的时候只是某一些局部在做变化,就可以用到模板的继承。

模板的继承:你自己先想好一个你想要继承的模板页面。

{% extends 'tem.html' %}

继承了值后子页面跟模板页面长得一模一样,你需要在模板页面上体检划定可以被修改的区域

{% block content %}
{% endblock %}

子页面就可以声明想要修改哪块划定了的区域

{% block content %}
	子页面内容
{% end block %}

一般情况下模板页面上应该至少有三块可以被修改的区域

  1. css区域

  2. html区域

  3. js区域

{% block css %}
{% endblock %}

{% block css %}
{% endblock %}

{% block js %}
{% endblock %}

这样每一个子页面就可以拥有自己的js、css和html页面。

一般情况下,模板中被划定的区域越多越好。但如果太多,还不如重新写一个页面。

六、模板的导入(了解)

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

七、总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值