Django模板语言(二)

Django 的模板引擎中最强大的,也是最复杂的—部分是模板继承。模板继承允许你建立一个基本的“骨架”模板,它包含了你网站的所有常用元素,并定义了子模板可以覆盖的块。

extends标签,模板继承

首先创建一个基础模板 base.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css">
    <title>{% block title %}基类模板{% endblock %}</title>
</head>

<body>
    <div id="sidebar">
        {% block sidebar %}
        <ul>
            <li><a href="https://www.baidu.com">访问百度</a></li>
        </ul>
        {% endblock %}
    </div>

    <div id="content">
        {% block content %}{% endblock %}
    </div>
</body>
</html>

上面的base.html模板,是定义了一个 HTML 骨架,可以用它来制作一个页面。“子”模板的工作是用内容填充空块。

在例子中,block 标签定义了三个块,子模板可以填入其中。block 标签所做的就是告诉模板引擎,子模板可以覆盖模板的这些部分。

 

编写一个继承base.html的页面

# 定义一个视图

def variable(request):
    var = {'var1': [1, 2, 3], 'var2': ['小李', '小华']}
    return render(request, 'variable.html', {'var': var})
# 创建一个继承base.html的模板

{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    {% for i in var.var1 %}
        <h2>{{ i }}</h2>
    {% endfor %}

    {% for i in var.var2 %}
        <p>{{ i }}</p>
    {% endfor %}
{% endblock %}
  • extends标签是关键词,用来声明继承来至哪个html
  • block标签可以直接理解为占位符,起到覆盖的作用;base.html中的block占位会被子模板中block中填充的数据给替换掉
# 添加一个访问路径

urlpatterns = [
    path('variable/', views.variable)
]

Django模板语言(二)

官方建议:

  1. 基础模板中的 {% block %} 标签越多越好。记住,子模板不需要定义所有的父模块,所以可以在一些块中填入合理的默认值,然后只定义以后需要地块。钩子多比钩子少要好。
  2. 如果你发现自己的内容在多个模板中重复,可能意味着你应该把这些内容移到父模板中的 {% block %}。

autoescape 标签使用 on 或 off 作为参数,控制转义(可针对模块)

def variable(request):
    var = {'var1': [1, 2, 3], 'var2': 123456789, 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})

var中的var3的值中包含“ < ”,是待转义的数据

  • 不转义:{% autoescape on %}
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block autescape %}
    {% autoescape on %}
        <p>Hello {{ var.var3 }}</p>
    {% endautoescape %}
{% endblock %}

Django模板语言(二)

  • 转义:{% autoescape off %}
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block autescape %}
    {% autoescape off %}
        <p>Hello {{ var.var3 }}</p>
    {% endautoescape %}
{% endblock %}

Django模板语言(二)

 

safe 单个变量转义

def variable(request):
    var = {'var1': [1, 2, 3], 'var2': ['小李', '小华'], 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    <p>{{ var.var3|safe }}</p>
{% endblock %}

Django模板语言(二)

firstof

第一个不是 false 的参数变量(即存在、不为空、不是一个错误的布尔值,也不是一个零的数值)。如果所有传递的变量都是 false,则不输出任何内容

  • 参数值为False
def variable(request):
    var = {'var1': [1, 2, 3], 'var2': False, 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    <p>{% firstof var.var2 '是false,显示默认值' %}</p>
{% endblock %}

Django模板语言(二)

 

  • 参数为固定值
def variable(request):
    var = {'var1': [1, 2, 3], 'var2': 123456789, 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    <p>{% firstof var.var2 '是false,显示默认值' %}</p>
{% endblock %}

Django模板语言(二)

在<p>{% firstof var.var2 '是false,显示默认值' %}</p>中的“ 是false,显示默认值 ” 是可以去掉的,加默认值就是怕没参数时,显示出来提示下,可以不写默认值,如果不写的话,出现没值时,页面就显示为空白。

布尔操作

if 标签可以使用 andor 或 not 等逻辑运算符:

def variable(request):
    var = {'var1': [1, 2, 3], 'var2': 123456789, 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    {% for i in var.var1 %}
        {% if i == 1 or i == 2 %}
            <p>呵呵呵</p>
        {% endif %}
    {% endfor %}
{% endblock %}

Django模板语言(二)

if 标签也可以使用运算符 ==!=<><=>=innot inis 和 is not

length 求长度{% if messages|length >= 100 %}

你也可以在 if 表达式中使用过滤器判断

def variable(request):
    var = {'var1': [1, 2, 3], 'var2': 123456789, 'var3':'wo shi ni hen hao < !'}
    return render(request, 'variable.html', {'var': var})
{% extends "base.html" %}

{% block title %}继承模板后的访问{% endblock %}

{% block content %}
    {% for i in var.var1 %}
        {% if i|length == 0 %}
            <p>呵呵呵</p>
        {% endif %}
    {% endfor %}
{% endblock %}

Django模板语言(二)

 

以上总结或许能帮助到你,或许帮助不到你,但还是希望能帮助到你,如有疑问、歧义,评论区留言会及时修正发布,谢谢!


未完,待续…

一直都在努力,希望您也是!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值