Django之模板语法

目录

模板语法

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

模板层之模板传值

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

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

Django之模板语法

模板层之模板取值

取值
        django模板语法取值 只有一种操作方式  句点符 .
        点索引
        点键
        
        <p>{{ l.2 }}</p>
        <p>{{ d.username }}</p>
        <p>{{ d.password }}</p>
        <p>{{ d.hobby.1.username.1 }}</p>

模板语法之过滤器

在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            # 取消转义操作

使用案例:

<p>过滤器  |左边的会当做过滤器的第一个参数 过滤器名右边的会当做过滤器的第二个参数</p>
    <p>求数据长度:{{ s|length }}</p>
    <p>加法运算:{{ n|add:10 }}、{{ s|add:13132 }}、{{ s|add:'DSB' }}</p>
    <p>默认值(判断值是否为空):{{ b|default:'这个b布尔值是True' }}、{{ ff|default:'这个ff布尔值是Flase' }}</p>
    <p>截取字符(截取5个字符 三个点也算):{{ s|truncatechars:8 }}</p>
    <p>截取单词(截取8个单词 三个点不算):{{ ss|truncatewords:8 }}、{{ sss|truncatewords:4 }}</p>
    <p>文件大小:{{ file_size|filesizeformat }}</p>
    <p>切片操作:{{ s|slice:'0:2' }}、{{ s|slice:"0:8:2" }}</p>
    <p>日期格式化:{{ ddd|date:'Y年/m月/d日' }}</p>
    <p>转义:{{ res|safe }}、{{ res1 }}、后端直接标识安全:{{ res2 }}</p>

前后端取消转义:

前端
        |safe
    后端
        from django.utils.safestring import mark_safe
        mark_safe('<h1>安全滴</h1>')
总结:前端代码不一定非要在前端页面写,可以在后端写好传递给前端页面使用
这样的话 你就可以利用到后端更加多的逻辑语法

模板语法之标签

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

{% for foo in l %}  <!--l = [1,2,3,4,5,6]-->
    {% if forloop.first %}
        <p>这是我的第一次</p>
    {% elif forloop.last %}
        <p>这是最后一次了啊~</p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
    {% empty %}
    <p>for循环的对象内部没有值</p>
{% 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之模板语法

第二步html页面使用方式:

<p>自定义过滤器的使用</p>
    {% load mytag %}
    <p>{{ 10|my_sum:90 }}</p>

Django之模板语法

自定义标签

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

自定义标签的使用:

<p>自定义标签的使用</p>
    {% load mytag %}
    <p>{% my_baby 1 2 3 'hello world' %}</p>

总结:

<p>自定义的过滤器可以在逻辑语句中,而自定义的标签不可以</p>
    {% if 10|my_sum:100 %}
        <p>条件成立</p>
    {% endif %}

    {% if my_baby 1 2 3 4 %}
        <p>条件成立</p>
    {% endif %}
        
    <p>自定义inclusion_tag的使用</p>
    {% 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循环

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循环可用的一些参数:

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

for ... empty

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

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 %}

模板语法注释

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

相关推荐