最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

Django模板层 (变量分配 过滤器 标签 继承和导入 自定义过滤器、标签及inclusion_tag(了解))

来源:博客园

目录

一、模板变量分配

定义

在后端变量的值通过模板语法传到前端
  • 符号{{}}:主要与数据值相关{%%}:主要与逻辑相关

  • 模板语法注意点:1.针对需要加括号调用的名字 django模板语法会自动加括号调用你只需要写名字就行2.模板语法的注释{##},前端浏览器是无法查看的,因为它要先在后端运行3.django的模板语法是自己写的 跟jinja2不一样,只能用句点符的方式点出来

  • 模板语法两种传值方法

return render(request, "demo02.html", {"n1": name, "a1": age})  # 传值方式1:精准传值 不浪费资源 针对多资源的传递书写麻烦
return render(request,"demo02.html", locals())  # 传值方式2:将函数名称空间中所有的名字全部传递 名字过多并且不使用的情况下比较浪费资源
  • 模板语法传值特性1.基本数据类型正常展示2.文件对象也可以展示并调用方法3.函数名会自动加括号执行并将返回值展示到页面上(不支持额外传参)4.类名也会自动加括号调用,对象则不用加括号也可以调用(除非用魔法)

ps:总结针对可以加括号调用的名字模板语法都会自动加括号调用

  • 代码展示

前端

{{ f }}

{{ i }}

{{ s }}

{{ l }}

{{ d }}

{{ t }}

{{ se }}

{{ b }}

{{ f_obj }}

{{ f_obj.read }}

你看到了什么 快分享给我看看!!!

{{ func1 }}

{{ MyClass }}

{{ obj }}

{{ obj.get_obj }}

{{ obj.get_cls }}

{{ obj.get_static }}

后端

def func(request):    # python基本数据类型    f = 1.11    i = 666    s = "hello jason! say hello big baby ha ha ha"    l = [11, 22, 33, 44]    d = {"name": "jason", "age": 18}    t = (11, 22, 33, 44)    se = {11, 22, 33, 44}    b = True    # 文件对象    f_obj = open(r"D:\pythonProject03\djangoday04\今日内容.md", "rb")    # 函数    def func1():        print("上午犯困 下午也犯困 晚上还犯浑")        return "熬夜会上瘾"    # 类    class MyClass(object):        def get_obj(self):            return "绑定给对象的方法"        @classmethod        def get_cls(cls):            return "绑定给类的方法"        @staticmethod        def get_static():            return "静态方法"    obj = MyClass()

页面效果

二、模板的过滤器

定义

模块语法自带的一些内置函数

语法

{{obj|filter__name:param}}  变量名字|过滤器名称:变量
  • default

    如果一个变量是false或者为空,使用给定的默认值。否则,使用变量的值。例如:

{{ value|default:"nothing"}}
  • length返回值的长度。它对字符串和列表都起作用。例如:如果 value 是 [‘a’, ‘b’, ‘c’, ‘d’],那么输出是 4。
{{ value|length }}
  • filesizeformat将值格式化为一个 “人类可读的” 文件尺寸 (例如 "13 KB", "4.1 MB", "102 bytes", 等等)。例如:如果 value 是 123456789,输出将会是 117.7 MB
{{ value|filesizeformat }}
  • date如果 value=datetime.datetime.now()
{{ value|date:"Y-m-d"}}
  • slice如果 value=”hello world”,将会是llo worl
{{ value|slice:"2:-1"}}
  • truncatechars如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“…”)结尾。参数:要截断的字符数
{{ value|truncatechars:9}}
  • safeDjango的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。比如:
value="点击"{{ value|safe}}from django.utils.safestring import mark_saferes = mark_safe("

HELLO WORLD

")
  • 代码展示

前端

{{ i|add:10 }}

{{ s|add:"baby" }}

{{ l|length }}

{{ s|slice:"1:4" }}

{{ value|slice:"2:-1"}}

{{ s|truncatechars:5 }}

{{ s|truncatewords:3 }}

{{ ctime|date:"Y年-m月-d日 H时:i分:s秒 " }}

{{ file_size|filesizeformat }}

{{ h1|safe }}

{{ s1|safe }}

后端

def func(request):    from datetime import date,datetime    ctime = datetime.today()    import os    file_size = 424232423423432    h1 = "

哈哈哈哈

" s1 = "<script>confirm(123)</script>" return render(request, "funcPage.html", locals())

页面效果

三、模板之标签

  • if标签在html页面if ,然后tab键补全语法
{% if 条件1(可以自己写也可以用传递过来的数据) %}

今天又是周三了

{% elif 条件2(可以自己写也可以用传递过来的数据) %}

百日冲刺

{% else %}

没多少时间了!

{% endif %}
  • for标签在html页面for ,然后tab键补全语法
{% for k in t1 %}{% if forloop.first %}

这是我的第一次循环{{ k }}

{% elif forloop.last %}

这是我的最后一次循环{{ k }}

{% else %}

这是中间循环{{ k }}

{% endif %}{% empty %}

你给我传的数据是空的无法循环取值(空字符串、空列表、空字典)

{% endfor %}
  • forloop关键字
# 遍历字典# 字典的三剑客keys values itemsforloop.counter            The current iteration of the loop (1-indexed) 当前循环的索引值(从1开始)forloop.counter0           The current iteration of the loop (0-indexed) 当前循环的索引值(从0开始)forloop.revcounter         The number of iterations from the end of the loop (1-indexed) 当前循环的倒序索引值(从1开始)forloop.revcounter0        The number of iterations from the end of the loop (0-indexed) 当前循环的倒序索引值(从0开始)forloop.first              True if this is the first time through the loop 当前循环是不是第一次循环(布尔值)forloop.last               True if this is the last time through the loop 当前循环是不是最后一次循环(布尔值)forloop.parentloop         本层循环的外层循环

ps: django模板语法取值操作>>>:只支持句点符,句点符既可以点索引也可以点键

d1 = {"name": "jason", "age": 18, "hobby": ["read", "music", {"a1": "haha", "a2": "heihei"}]}{{ d1.hobby.2.a1 }}
  • 起别名复杂数据获取之后需要反复使用可以起别名
{% with d1.hobby.2.a1 as h %}  {{ h }}{% endwith %}

四、自定义过滤器、标签及inclusion_tag(了解)

  • 前期准备工作如果想要自定义一些模板语法 需要先完成下列的三步走战略1.在应用下创建一个名字必须叫templatetags的目录2.在上述目录下创建任意名称的py文件3.在上述py文件内先编写两行固定的代码
from django import templateregister = template.Library()
  • 自定义过滤器(最大只能接收两个参数)
@register.filter(name="myadd")def func1(a, b):    return a + b

目前编辑的页面代码

{% load mytags %}   # 加载自己创建的py文件

{{ i|myadd:1 }}

  • 自定义标签(参数没有限制)
@register.simple_tag(name="mytag")def func2(a, b, c, d, e):    return f"{a}-{b}-{c}-{d}-{e}"

目前编辑的页面代码

{% load mytags %}     # 加载自己创建的py文件{% mytag "jason" "kevin" "oscar" "tony" "lili" %}
  • 自定义inclusion_tag(局部的html代码)

调用函数,在一个自己新建的空html文件中执行,执行完后再塞进需要用的html页面

@register.inclusion_tag("menu.html",name="mymenu")def func3(n):    html = []    for i in range(n):        html.append("
  • 第%s页
  • "%i) return locals()

    新建的借助menu.html页面代码

      {% for liStr in html %} {{ liStr|safe }} {% endfor %}

    目前编辑的页面代码

    {% load mytags %}     # 加载自己创建的py文件{% mymenu 20 %}

    五、模板的继承和导入

    模板的继承(重要)

    定义

    多个页面有很多相似的地方 我们可以采取下列方式

    • 方式1:传统的复制粘贴
    • 方式2:模板的继承
    1.在模板中使用block划定子板以后可以修改的区域            {% block 区域名称 %}继承的旧代码区域                {% endblock %}       2.子板继承模板        {% extends "home.html" %}    # 首先要先导入母版            {% block 区域名称 %}                继承的新代码区域                {% endblock %}补充:子板也可以继续使用模板的内容 {{ block.super }}

    ps:模板中至少应该有三个区域,分别是页面内容区、css样式区、js代码区

    模板的导入(了解)

    定义

    将某个html的部分提前在一个空的html页面写好 之后很多html页面都想使用就可以导入,在需要导入的地方

    {% include "myform.html" %}

    直接上代码,以后可以粘贴复制

    • 母板
            Title    {#    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>#}    {#    #}    {#    <script src="bootstrap-3.4.1-dist/js/bootstrap.js"></script>#}    {% load static %}    <script src="{% static "jquery.min.js" %}"></script>        <script src="{% static "bootstrap-3.4.1-dist/js/bootstrap.min.js" %}"></script>    
    {% block content %}

    这里青青草原的网页

    里面记录着羊村和狼堡的信息

    了解羊村

    ...

    武大狼的第250代子孙,第77代狼王,自称“本大王”,喜羊羊等人也称他为“灰太狼大王”。疼爱孩子的好丈夫、好爸爸。

    ...

    Button Button

    ...

    黑大帅,动画片《喜羊羊与灰太狼》系列中的反派角色,后来成为正面角色,初登场于动画《喜羊羊与灰太狼之古古怪界大作战》第4集(即《喜羊羊与灰太狼》第一部第284集)作为反派角色,来自地底下的古古怪界。

    ...

    Button Button

    ...

    武泰哥,又称老虎大叔。为国产动画片《喜羊羊与灰太狼》系列中出现的人物,原型是一只金黄色的华南虎,四臂有健壮的肌肉,胸部点缀着两大块胸肌。常常举行肌肉展示,包包大人为他伤透了脑筋。

    ...

    Button Button

    ...
    ...
    {% endblock %}
    • 子板1
    {% extends "Monpage.html" %}{% block css %}    {% endblock %}{% block content %}    

    登录页面

    {% include "daoru.html" %}

    username:

    password:

    {% endblock %}{% block js %} <script>alert("注册页面")</script>{% endblock %}
    • 子板2
    {% extends "Monpage.html" %}{% block css %}    {% endblock %}{% block content %}    

    注册页面

    {% include "daoru.html" %}

    username:

    password:

    {% endblock %}{% block js %} <script>alert("注册页面")</script>{% endblock %}
    • 母板页面效果
    • 子板页面效果

    关键词: