Django-模板层

目录

-模板语法

--传值与取值

--过滤器

---语法

---使用示例

--标签

---for循环

---if判断

--自定义过滤器、标签,inclusion_tag

---步骤

---自定义过滤器

---自定义标签

---inclusion_tag

-模板的继承

--使用示例

-模板的导入

--含义

--使用


-模板语法

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

--传值与取值

模板语法能把后端所有数据类型及函数、类等传到前端,会自动识别前端数据中能加括号调用的函数或类进行调用,但函数或类中不能有参数(模板语法固定不支持传参,所以针对有形参传入的干脆不加括号执行)

模板语法只能通过"句点符""."取值,不管是.键还是.索引,反正就只支持.取值,且两者可混用

views.py see_template() 

# 模板语法传值给前端页面研究
def see_template(request):
    i = 666
    f = 11.11
    b = True
    s = 'weer'
    l = ['weer', 'xueer', 'yuner']
    t = (111, 222, 333)
    d = {'name':'weer', 'age':18, 'hobby':['python', 'IT', {'wife':'yunyun'}]}
    se = {1, 2, 3, 4}
    def func(): # 不能是有形参的函数,否则前端干脆不执行
        return '函数结果'
    class MyClass():
        def class_func(self):
            return '类中函数返回结果'
    obj = MyClass()
    return render(request, 'html02 模板语法传值.html', locals())

 html02 模板语法传值.html

    <p>{{ i }}</p>
    <p>{{ f }}</p>
    <p>{{ b }}</p>
    <p>{{ s }}</p>
    <p>{{ l }}</p>
    <p>{{ t }}</p>
    <p>{{ d }}</p>
    <p>{{ se }}</p>
    <p>{{ func }}</p>
    <p>自动加括号调用,返回的是一个类的结果对象{{ MyClass }}</p>
    <p>类实例化得到的对象:{{ obj }}</p>
    <p>类中方法class_func返回结果:{{ obj.class_func }}</p>
    {# 模板语法取值 #}
    <p>{{ l.1 }}</p>
    <p>{{ d.hobby.2.wife }}</p>

 结果

666

11.11

True

weer

['weer', 'xueer', 'yuner']

(111, 222, 333)

{'name': 'weer', 'age': 18, 'hobby': ['python', 'IT', {'wife': 'yunyun'}]}

{1, 2, 3, 4}

函数结果

自动加括号调用,返回的是一个类的结果对象:<app01.views.see_template.<locals>.MyClass object at 0x000001E24C50AEF0>

类实例化得到的对象:<app01.views.see_template.<locals>.MyClass object at 0x000001E24C55E3C8>

类中方法class_func返回结果:类中函数返回结果

xueer

yunyun

--过滤器

过滤器就类似于"内置方法",Django中有60多个过滤器,先只介绍10多个,后面用到再去学习记忆

---语法

{{ 数据|过滤器:参数 }}    注:过滤器最多只能传2个参数!!!

---使用示例

views.py filter_use()

def filter_use(request):
    i = 666
    f = 11.11
    b = False
    file_size = 1024    # 假定文件大小
    h1 = '<h1>转义标题</h1>'
    script_back = '<script>alert(123)</script>'
    s = 'weer喜欢学Python,喜欢看动画,最喜欢不良人、凡人等,国漫yyds'
    words = 'weer love wives that are yuner xueer and so on'
    l = ['weer', 'xueer', 'yuner', 'shasha', 'linger', 'yunxi']
    t = (111, 222, 333)
    d = {'name':'weer', 'age':18, 'hobby':['python', 'IT', {'wife':'yunyun'}]}
    se = {1, 2, 3, 4}
    import datetime
    current_time = datetime.datetime.now()
    from django.utils.safestring import mark_safe
    res = mark_safe('<h1>后端转义方法</h1>')
    return render(request, 'html03 模板语法之过滤器and标签.html', locals())

 html03 模板语法之过滤器and标签.html

<body>
    <h1 class="text-center">过滤器使用</h1>
    <p>统计长度:{{ s|length }}</p>  <!--字符串-->
    <p>统计长度:{{ l|length }}</p>  <!--列表-->
    <p>默认值:{{ b|default:'weer' }}</p>   <!--当参数表示为True时显示它,当其表示为False时显示default冒号后面的值-->
    <p>默认值:{{ i|default:888 }}</p>  <!--i=666表示True,故显示666而不是888-->
    <p>文件大小(自动换算成KB/MB/GB):{{ file_size|filesizeformat }}</p>
    <p>日期格式化:{{ current_time|date:'Y-m-d H-i-s' }}</p>  <!--不用带%了-->
    <p>切片操作(支持步长):{{ l|slice:'0:4:2' }}</p>
    <p>切取字符:{{ s|truncatechars:15 }}</p>    <!--包含三个点在内-->
    <p>切取单词:{{ words|truncatewords:7 }}</p> <!--按照空格切,不包含三个点-->
    <p>移除特定字符:{{ s|cut:'yyds' }}</p>    <!--移除字符后显示移除完的内容,不影响原内容-->
    <p>拼接操作之join:{{ l|join:'$' }}</p>    <!--将列表拼接成字符串-->
    <p>拼接操作之add:{{ i|add:222 }}</p>     <!--add可拼加数字-->
    <p>拼接操作之add:{{ s|add:words }}</p>   <!--add也能拼接字符串-->
    <p>转义:{{ h1 }}</p>          <!--默认不识别后端的前端代码-->
    <p>转义:{{ h1|safe }}</p>
    <p>转义:{{ script_back|safe }}</p>
   <p>后端转义:{{ res }}</p>
</body>

PS:前后端转义意味着后端也能写前端代码,即先在后端写好再传到前端 

--标签

这的"标签"指的是一些流程控制语句

---for循环

先看for循环中的一个变量:forloop:

{% for foo in l %}
    <p>{{ forloop }}</p>
{% endfor %}

          

{% for foo in l %}
    <p>{{ foo }}</p>
{% endfor %}

---if判断

{% if i > 222 %}
   <p>666</p>
{% elif i < 666 %}
   <p>888</p>
{% else %}
   <p>999</p>
{% endif %}

--自定义过滤器、标签,inclusion_tag

---步骤

1.在应用文件夹下创建一个名字必须为"templatetags"文件夹

2.在该文件夹下创建任意名称的.py文件 (即用来写自定义…的文件)     eg:mytag1.py

3.在该py文件内必须先写两句话(必须一字不差):

from django import template

register = template.Library()

之后才能在该.py文件中写自定义标签、过滤器、inclusion_tag(先用@register…语法声明)
使用时都需要先加载该.py文件:       {% load mytag1 %}

---自定义过滤器

	定义:
		@register.filter(name='add_int')
		def func1(int1, int2):                        # !!!函数形参最多2个
		    return int1 + int2
	使用:
		{% load mytag01 %}
        <p>自定义过滤器简单使用:{{ i|add_int:222 }}</p>

---自定义标签

	定义:
		@register.simple_tag(name='wife')
		def show_wife(x1, x2, x3, x4):                 # 可传多个参数
		    return 'wives: %s-%s-%s-%s' % (x1, x2, x3, x4)
	使用:
		 {% load mytag01 %}
         <p>{% wife 'yuner' 'xueer' 'shasha' 'xuner' %}</p> 参数彼此用空格隔开就行

---inclusion_tag

多用于返回html代码片段

先定义一个方法

在页面上调用该方法,并且可以传值

该方法会生成一些数据然后传递给一个html页面

之后将渲染好的结果放到调用的位置 

-模板的继承

对一些网站,整体布局有相同的地方,比如只有右下方内容在变,而导航条和左侧面板都没变的这种网站,就可能用到了模板的继承

模板继承:选定一个想要继承的母页面继承即可:     {% extend 'mother.html'%}

继承母页面的子页面和母页面是一样的,要想在母页面的基础上修改使其称为子页面,需要事先在母页面中用block划分区域并起名,然后在子页面上指明要修改的区域做修改即可

一般一个html文件至少应该有三个可被修改区域:

css区域            js区域                html(body)区域

--使用示例

使用示例

-模板的导入

--含义

就是将一个页面当做一个局部,若其他很多html页面都需使用到它,则可以以导模块的形式在前端代码中导入该文件    就相当于把该页面代码塞到导入代码那块

--使用

	templates文件夹下有一个'html06 模板语法之导入.html'文件,里面内容是一张图片
	若想在上面的继承案例中的注册和登录下使用该文件:
		{% extends 'html05 模板语法之继承 母页面.html' %}
		
		{% block content %}
		    <div>
		        <h1 class="text-center">登录</h1>
		        <form action="">
		            <p>username:<input type="text" class="form-control"></p>
		            <p>password:<input type="password" class="form-control"></p>
		            <input type="submit" class="btn btn-success btn-block" value="登录">
		        </form>
		        {% include 'html06 模板语法之导入.html' %}   # 导入使用
		    </div>
        {% endblock %}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weer-wmq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值