Django之模板语法

目录

  • 模板语法
  • 模板层之模板传值
  • 模板层之模板取值
  • 模板语法之过滤器
  • 模板语法之标签
  • 自定义过滤器
  • 自定义标签
  • 模板的继承
  • 模板的组件
  • for循环
  • if,elif,else判断
  • with
  • 模板语法注释

模板语法

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

模板层之模板传值

python基本数据类型全部支持传递给html文件
    函数
    类
        函数和对象会自动加括号
        # 模板语法不支持传参
    对象
        后端给html文件传递数据的两种方式
        1.指名道姓
            return render(request,'index.html',{'n':n,'f':f})

        2.locals()  # 会将当前名称空间中所有的变量名全部传递给html页面
            return render(request,'index.html',locals())  
    
        html页面上 如何获取到后端传递过来的数据 
            {{ 变量名 }}

Django之模板语法_第1张图片

模板层之模板取值

取值
        django模板语法取值 只有一种操作方式  句点符 .
        点索引
        点键
        
        

{{ l.2 }}

{{ d.username }}

{{ d.password }}

{{ d.hobby.1.username.1 }}

模板语法之过滤器

在Django的模板语言中,通过使用 过滤器 来改变变量的显示。

过滤器的语法: {{ value|filter_name:参数 }}

使用管道符"|"来应用过滤器。

例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。

注意事项:

    1.过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
    2.过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
    3.过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
    4.'|'左右没有空格没有空格没有空格
    |length          # 返回值的长度,作用于字符串和列表
    |add             # 加法运算
    |default         # 如果一个变量是false或者为空,使用给定的默认值。 否则,使用变量的值
    |truncatechars    # 截取字符串的长度。三个点也算,所有如果要截取5个长度,应该5+3=8的长度
    |truncatewords    # 截取单词、词语,以空格为标识
    |filesizeformat   # 把文件大小转换成人能看懂的。KB,GB
    |slice           # 切片操作
    |date            # 日期格式化
    |safe            # 取消转义操作

使用案例:

    

过滤器 |左边的会当做过滤器的第一个参数 过滤器名右边的会当做过滤器的第二个参数

求数据长度:{{ s|length }}

加法运算:{{ n|add:10 }}、{{ s|add:13132 }}、{{ s|add:'DSB' }}

默认值(判断值是否为空):{{ b|default:'这个b布尔值是True' }}、{{ ff|default:'这个ff布尔值是Flase' }}

截取字符(截取5个字符 三个点也算):{{ s|truncatechars:8 }}

截取单词(截取8个单词 三个点不算):{{ ss|truncatewords:8 }}、{{ sss|truncatewords:4 }}

文件大小:{{ file_size|filesizeformat }}

切片操作:{{ s|slice:'0:2' }}、{{ s|slice:"0:8:2" }}

日期格式化:{{ ddd|date:'Y年/m月/d日' }}

转义:{{ res|safe }}、{{ res1 }}、后端直接标识安全:{{ res2 }}

前后端取消转义:

前端
        |safe
    后端
        from django.utils.safestring import mark_safe
        mark_safe('

安全滴

') 总结:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用 这样的话 你就可以利用到后端更加多的逻辑语法

模板语法之标签

模板语法之标签  (逻辑相关)

{% for foo in l %}  
    {% if forloop.first %}
        

这是我的第一次

{% elif forloop.last %}

这是最后一次了啊~

{% else %}

{{ foo }}

{% endif %} {% empty %}

for循环的对象内部没有值

{% endfor %}

自定义过滤器

自定义过滤器 标签 inclusion_tag
先完成以下前期准备工作
    1.在应用名下新建一个名字必须叫templatetags文件夹
    2.在该文件夹内新建一个任意名称的py文件(eg:mytag)
    3.在该文件内 必须先写以下两句代码
        from django.template import Library
        
        register = Library()
        
    # 自定义过滤器
    @register.filter(name='my_sum')
    def index(a,b):
        return a + b

第一步定义:

Django之模板语法_第2张图片

第二步html页面使用方式:

自定义过滤器的使用

{% load mytag %}

{{ 10|my_sum:90 }}

Django之模板语法_第3张图片

自定义标签

    # 自定义标签
    @register.simple_tag(name='my_baby')
    def xxx(a,b,c,d):
        return '%s?%s?%s?%s'%(a,b,c,d)

自定义标签的使用:

自定义标签的使用

{% load mytag %}

{% my_baby 1 2 3 'hello world' %}

总结:

自定义的过滤器可以在逻辑语句中,而自定义的标签不可以

{% if 10|my_sum:100 %}

条件成立

{% endif %} {% if my_baby 1 2 3 4 %}

条件成立

{% endif %}

自定义inclusion_tag的使用

{% load mytag %} {% myin 5 %} # 总结 页面上使用他们 统一先导入 {% load mytag %}

模板的继承

某一个页面大部分区域都是公用的 那这个页面就可以作为模板页面
    当别人继承这个页面之后 如何修改对应的区域

使用方法:

1.先在模板页面上通过block实现划定区域
    {% block content %} 
            模板页面内容
        {% endblock %}
2.子页面中先导入整个模板
    {% extends '模板页面.html'%}
        修改特定的区域  通过实现划定好的区域名称
        {% block content %}
            子页面内容
        {% endblock %}

通常情况下 模板页面页面应该起码有三块区域

    1.css部分
        {% block css %} 
            模板页面内容
        {% endblock %}
    2.内容部分
        {% block content %} 
            模板页面内容
        {% endblock %}
    3.JS部分
        {% block js %}  
            模板页面内容
        {% endblock %}
        
    # 模板的block块越多 可扩展性越高
    
    还支持子页面调用父页面对应区域的内容 并且可以无限次调用
        {{ block.super }}

模板的组件

可以将局部样式布局提前写好,然后哪里需要导哪里(不常用)

将html页面当做模块使用 哪里需要导哪里  这个html页面通常都不是完整的 只是一个局部样式
    {% include 'left.html' %}

for循环

普通for循环

    {% for user in user_list %}
  • {{ user.name }}
  • {% endfor %}

for循环可用的一些参数:

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

for ... empty

    {% for user in user_list %}
  • {{ user.name }}
  • {% empty %}
  • 空空如也
  • {% endfor %}

if,elif,else判断

{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

也可以只有if和else

{% if user_list|length > 5 %}
  七座豪华SUV
{% else %}
    黄包车
{% endif %}

if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。

with

定义一个中间变量,多用于给一个复杂的变量起别名。

注意等号左右不要加空格。

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

模板语法注释

{# 注释内容 #}              //这样方式注释,前端浏览器检查看不见
             //浏览器检查能看见

你可能感兴趣的:(Django之模板语法)