本文将为您提供关于Golang模板引擎管道的详细介绍,我们还将为您解释golang模板引擎的相关知识,同时,我们还将为您提供关于django-模板引擎进阶、Django模板引擎以及模板、django默
本文将为您提供关于Golang模板引擎管道的详细介绍,我们还将为您解释golang 模板引擎的相关知识,同时,我们还将为您提供关于django - 模板引擎进阶、Django 模板引擎以及模板、django 默认模板引擎和 jinja2 模板引擎、django-3.模板引擎的实用信息。
本文目录一览:Golang模板引擎管道(golang 模板引擎)
我有一个Golang模板,定义如下
{{- define "test" -}}{{- printf "%s" .Name | trunc 24 -}}{{- end -}}
然后在我的一个文件中使用它:
{{ template "test" . }}
“测试”之后,点是什么意思?Golang模板文档说:
{{template "name" pipeline}}The template with the specified name is executed with dot setto the value of the pipeline.
但是我不确定是什么管道。阅读文档没有结果,有人可以再解释一次吗?
另外,为什么我们必须以点开始的值?例如{{ - printf "%s" .Name | trunc 24 -}}
。这也是一种管道吗?
先感谢您!
答案1
小编典典有2个template
软件包,text/template
和html/template
。
它们具有相同的接口,但是该html/template
程序包用于生成安全的HTML输出,以防止代码注入,因此应使用该程序包,而不是text/template
在输出为HTML时使用。
由于它们具有相同的界面,但是html/template
提供了一些额外的功能(对插入的数据进行上下文转义),因此仅在上记录了基础知识和原理text/html
,而html/template
大多数文献则集中在详细说明额外内容上。
话虽如此,“管道”属于基础。它记录在管道text/template
部分:
流水线
管道是“命令”的可能链接的序列。命令是一个简单的值(参数)或函数或方法调用,可能带有多个参数:
Argument The result is the value of evaluating the argument..Method [Argument...] The method can be alone or the last element of a chain but, unlike methods in the middle of a chain, it can take arguments. The result is the value of calling the method with the arguments: dot.Method(Argument1, etc.)functionName [Argument...] The result is the value of calling the function associated with the name: function(Argument1, etc.) Functions and function names are described below.
通过用流水线字符“
|”分隔命令序列,可以“链接”流水线。在链式管道中,每个命令的结果作为以下命令的最后一个参数传递。流水线中最终命令的输出是流水线的值。
“参数”和“管道”是对数据的评估。
“点”.
基本上是一个光标,指向执行模板时传递的数据结构中的某处。点的起始值是您传递的值,但是许多操作(例如{{range}}
或)都会修改该点{{with}}
。
执行模板将遍历结构并设置光标,并用句点“。”表示。并在执行过程中将其称为“点”到结构中当前位置的值。
因此,在编写时.Name
,这表示点当前指向的值,您要引用其字段或方法或称为的键Name
。例如,如果您传递struct
,则模板的开头.Name
将表示struct字段(Name
如果存在)或其命名为的方法Name()
。
调用/包含另一个模板时,您可以告诉您将什么值传递给其执行。编写时{{template "something".}}
,这意味着您要将当前由点指向的值传递给模板执行。如果只希望传递Name
点所指向的结构的字段,则可以像那样进行{{template"something" .Name}}
。
您在管道中传递的值{{template}}
将成为调用的其他模板内的点。
因此,在处理/渲染模板时,点可能会更改,并且“仅”指向最初传递给模板执行的部分值。通常它很方便,或者仍然需要达到原始值,而不仅仅是光标。为此,模板包提供了$
:
开始执行时,将$设置为传递给Execute的数据参数,即dot的起始值。
因此,即使您位于{{range}}
例如(将点设置为要遍历的数组/ slice
/映射的连续元素)内,您仍然可以伸手并引用传递给该对象的值的任何其他部分模板执行。
因此,例如,如果您遍历像这样的书{{range .Books}}
,并且需要Name
原始传递的struct
的字段,则可以在内部执行{{range}}
以下操作:
{{range .Books}} Title: {{.Title}} Original name: {{$.Name}}{{end}}
django - 模板引擎进阶
Django 模板系统
官方文档
常用语法
Django 模板中只需要记两种特殊符号:
{{ }} 和 {% %}
{{}} 表示变量,在模板渲染的时候替换成值,{% %} 表示逻辑相关的操作。
变量
{{变量名}}
变量名由字母数字和下划线组成。
点(.)在模板语言中有特殊的含义,用来获取对象的相应属性值。
几个例子:
view 中代码:
def template_test(request):
l = [11, 22, 33]
d = {"name": "alex"}
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def dream(self):
return "{} is dream...".format(self.name)
Alex = Person(name="Alex", age=34)
Egon = Person(name="Egon", age=9000)
Eva_J = Person(name="Eva_J", age=18)
person_list = [Alex, Egon, Eva_J]
return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
模板中支持的写法:
{# 取l中的第一个参数 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取对象的name属性 #}
{{ person_list.0.name }}
{# .操作只能调用不带参数的方法 #}
{{ person_list.0.dream }}
注:当模板系统遇到一个(.)时,会按照如下的顺序去查询:
- 在字典中查询
- 属性或者方法
- 数字索引
Filters
翻译为过滤器,用来修改变量的显示结果。
语法: {{value|filter_name: 参数}}
''|'' 左右没有空格没有空格没有空格
default
{{ value|default:"nothing"}}
如果 value 值没传的话就显示 nothing
注:TEMPLATES 的 OPTIONS 可以增加一个选项:string_if_invalid:'' 找不到 '',可以替代 default 的的作用。
filesizeformat
将值格式化为一个 “人类可读的” 文件尺寸 (例如 ''13 KB'', ''4.1 MB'', ''102 bytes'', 等等)。例如:
{{ value|filesizeformat }}
如果 value 是 123456789,输出将会是 117.7 MB。
add
给变量加参数
{{ value|add:"2" }}
value 是数字 4,则输出结果为 6。
{{ first|add:second }}
如果 first 是 [1,.2,3] ,second 是 [4,5,6] ,那输出结果是 [1,2,3,4,5,6] 。
lower
小写
{{ value|lower }}
upper
大写
{{ value|upper}}
title
标题
{{ value|title }}
ljust
左对齐
"{{ value|ljust:"10" }}"
rjust
右对齐
"{{ value|rjust:"10" }}"
center
居中
"{{ value|center:"15" }}"
length
{{ value|length }}
返回 value 的长度,如 value=[''a'', ''b'', ''c'', ''d''] 的话,就显示 4.
slice
切片
{{value|slice:"2:-1"}}
first
取第一个元素
{{ value|first }}
last
取最后一个元素
{{ value|last }}
join
使用字符串拼接列表。同 python 的 str.join (list)。
{{ value|join:" // " }}
truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
{{ value|truncatechars:9}}
date
日期格式化
{{ value|date:"Y-m-d H:i:s"}}
可格式化输出的字符:点击查看。
safe
Django 的模板中会对 HTML 标签和 JS 等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些 HTML 元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于 FCKeditor 编辑加注了 HTML 修饰符的文本,如果自动转义的话显示的就是保护 HTML 标签的源文件。为了在 Django 中关闭 HTML 的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器 “|safe” 的方式告诉 Django 这段代码是安全的不必转义。
比如:
value = "<a href=''#''> 点我 </a>"
{{ value|safe}}
自定义 filter
自定义过滤器只是带有一个或两个参数的 Python 函数:
- 变量(输入)的值 - - 不一定是一个字符串
- 参数的值 - 这可以有一个默认值,或完全省略
例如,在过滤器 {{var | foo:“bar”}} 中,过滤器 foo 将传递变量 var 和参数 “bar”。
自定义 filter 代码文件摆放位置:
app01/
__init__.py
models.py
templatetags/ # 在app01下面新建一个package package
__init__.py
app01_filters.py # 建一个存放自定义filter的py文件
views.py
编写自定义 filter
from django import template
register = template.Library()
@register.filter
def fill(value, arg):
return value.replace(" ", arg)
@register.filter(name="addSB")
def add_sb(value):
return "{} SB".format(value)
使用自定义 filter
{# 先导入我们自定义filter那个文件 #}
{% load app01_filters %}
{# 使用我们自定义的filter #}
{{ somevariable|fill:"__" }}
{{ d.name|addSB }}
Tags
for
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
for 循环可用的一些参数:
Variable | Description |
---|---|
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 %}
csrf_token
这个标签用于跨站请求伪造保护。
在页面的 form 表单里面写上 {% csrf_token %}
注释
{# ... #}
注意事项
1. Django 的模板语言不支持连续判断,即不支持以下写法:
{% if a > b > c %}
...
{% endif %}
2. Django 的模板语言中属性的优先级大于方法
def xx(request):
d = {"a": 1, "b": 2, "c": 3, "items": "100"}
return render(request, "xx.html", {"data": d})
如上,我们在使用 render 方法渲染一个页面的时候,传的字典 d 有一个 key 是 items 并且还有默认的 d.items () 方法,此时在模板语言中:
{{ data.items }}
默认会取 d 的 items key 的值。
母板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
{% block page-css %}
{% endblock %}
</head>
<body>
<h1>这是母板的标题</h1>
{% block page-main %}
{% endblock %}
<h1>母板底部内容</h1>
{% block page-js %}
{% endblock %}
</body>
</html>
注意:我们通常会在母板中定义页面专用的 CSS 块和 JS 块,方便子页面替换。
继承母板
在子页面中在页面最上方使用下面的语法来继承母板。
{% extends ''layouts.html'' %}
块(block)
通过在母板中使用 {% block xxx %}
来定义 "块"。
在子页面中通过定义母板中的 block 名来对应替换母板中相应的内容。
{% block page-main %}
<p>世情薄</p>
<p>人情恶</p>
<p>雨送黄昏花易落</p>
{% endblock %}
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。
{% include ''navbar.html'' %}
静态文件相关
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
引用 JS 文件时使用:
{% load static %}
<script src="{% static "mytest.js" %}"></script>
某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
使用 get_static_prefix
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
自定义 simpletag
和自定义 filter 类似,只不过接收更灵活的参数。
定义注册 simple tag
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)
使用自定义 simple tag
{% load app01_demo %}
{# simple tag #}
{% plus "1" "2" "abc" %}
inclusion_tag
多用于返回 html 代码片段
示例:
templatetags/my_inclusion.py
from django import template
register = template.Library()
@register.inclusion_tag(''result.html'')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}
templates/result.html
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>inclusion_tag test</title>
</head>
<body>
{% load my_inclusion %}
{% show_results 10 %}
</body>
</html>
Django 模板引擎以及模板
在Django框架中,可以使用两种模板引擎,一种是默认的Django模板引擎,还有一种是Jinja2模板引擎;
1.模版引擎的作用和优点
模版引擎作用是将View视图中需要在前端HTML页面中展示的数据,通过模板引擎的语法规则,展示出来;
模版引擎优点是将业务逻辑的Python代码和页面设计的HTML代码分离,使代码更干净整洁更容易维护,使Python程序员和HTML/CSS程序员分开协作,提高生产的效率,且将HTML代码分离出来,还能使其能够复用;
2.HTML模板存放的位置
HTML模板存放的位置有两个,一个是存放在settings文件中指定的DIRS的目录列表中,还有一个是直接在对应的APP包下,创建templates目录,将HTML放置于此即可,不同APP对其他APP目录下的templates目录都是可见的;
3.模板引擎的配置
先在项目的settings.py文件中找到TEMPLATES变量,然后加入
TEMPLATES = [
{
# 选择模板引擎,默认是Django的模板引擎
''BACKEND'': ''django.template.backends.django.DjangoTemplates'',
#或者是jinja2模版 ''BACKEND'': ''django.template.backends.jinja2.Jinja2''
# 指定HTML模板存放的目录,如果HTML模板较多,可以设置多个模板路径
''DIRS'': [os.path.join(BASE_DIR, ''templates'')],
# APP_DIRS的值判断是否支持将template目录放置在APP中,Django默认支持值为True
''APP_DIRS'': True,
''OPTIONS'': {
''context_processors'': [
''django.template.context_processors.debug'',
''django.template.context_processors.request'',
''django.contrib.auth.context_processors.auth'',
''django.contrib.messages.context_processors.messages'',
],
},
},
]
4.Django模板引擎的模板语法
变量(VARIABLE):
{{ VARIABLE }} # 用于引入后台传入的变量
{{ VARIABLE.name }}
{{ VARIABLE.age }}
标签(TAG):
{% TAG %} # 用于循环
1: 正序 for 循环
{% for item in items %}
<p>{{ forloop.counter }}</p>
<p>{{ item.name }}</p>
<p>{{ item.desc }}</p>
{% endfor %}
2: 倒叙 for 循环
{% for item in items reversed %}
<p>{{ forloop.counter }}</p> # 记录循环到第几次,计数从1开始
<p>{{ item.name }}</p>
<p>{{ item.desc }}</p>
{% endfor %}
3: 变量字典
{% for k,v in dictionary.items %}
<p>{{ k }},{{ v}}</p>
{% endfor %}
5.Django模板的继承的作用
在Django开发过程中,页面中的重复部分,可以通过Django的模板继承来完成,这样使得页面开发和管理更简单;
在HTML页面中使用到的关键字:
{% extends 这里填写被继承的HTML页面 %}
{% block 这里填写继承的block %} {% endblock %}
{% include 这里填写需要引入的HTML子页面 %}
6.如何实现继承模板
我们知道了模板可以用继承的方式来实现复用,那接下来我们一起来操作一下:
第一步:可以在项目的templates中先编写好一个html页面,作为网站的基础页面被其他页面继承,我的HTML页面为base.html,然后在其中编辑HTML代码,注意要修改的部分写在{% block %} {% endblock %}的中间;
<body>
<div>
今天是星期几呀
</div>
<!-- 内容变化部分 -->
{% block content %}
<div>
<p>今天是星期一</p>
</div>
{% endblock %}
<div>
好的,谢谢
</div>
</body>
第二步:在你想要的app的templates目录下创建一个html页面,继承之前的基础页面,我还是使用的courses app,创建一个python.html文件,这些名字都可以自己命名的,不过要注意路径之类的;
{% extends ''base.html'' %}
{% block content %}
<div>
<p>今天是星期{{ week_id }}</p>
</div>
{% endblock %}
第三步:在根路由urls.py中,添加访问路径的路由文件,一定要分清项目的了路由和app的路由哟;
url(r''^courses/'', include((''courses.urls'', ''courses''), namespace=''courses'')),
第四步:在app的路由文件urls.py中添加要访问的html路径;
urlpatterns = [
url(r''python/(?P<week_id>\d+)$'', python, name=''python'')
]
第五步:在app下的views.py中创建一个python函数;
from django.shortcuts import render
def python(request, week_id):
return render(request, ''python.html'', {''week_id'': week_id})
然后我们就可以运行项目,运行项目依旧是打断点,然后调试,我们看看结果是否是我们预期的结果呢,比如我的访问路径是
http://127.0.0.1:8000/courses/python/1
python后面接数字,不然会报错,因为我们在第四步中添加路由访问的html路径的时候正则表达式验证必须是数组,这个可以大家自己修改的,可以按照自己的想法来做练习哟;
django 默认模板引擎和 jinja2 模板引擎
在使用中,大家会发现 django 默认模板引擎有很多局限性,最明显的就是四则运算。就只能加减,乘除都不支持。另外还有判断相等,不能直接 if
,要用 ifequal
。确实不太方便。还有一点,django 默认模板引擎很慢,jinja2 宣称比 django 默认模板引擎快 10-20 倍。
两种模板语言在使用上差别不是很大。 jinja2 功能更强大,运行速度也比自带的模板要快很多。
Django 主流的第三方 APP 基本上也都同时支持 Django 默认模板及 jinja2,如果要用 jinja2 也不会有多少障碍。
不过,django 更换模板引擎,需要修改一些东西,如果对 Django 还不熟悉,建议用默认的,省心。等对 Django 有了一定的熟悉后再根据项目实际情况及个人偏好进行选择。
先来安装,pip3 install jinja2
。
配置:从 Django1.8 开始,支持第三方模板引擎,可以很容易的配置到。首先,在你的项目下建立一个 jinja2_env.py
,内容如下:
#from __future__ import absolute_import # 如果是py2就取消这行的注释
from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse from jinja2 import Environment def environment(**options): env = Environment(**options) env.globals.update({ ''static'': staticfiles_storage.url, ''url'': reverse, }) return env
然后在 setting.py
设置
TEMPLATES = [
{
''BACKEND'': ''django.template.backends.jinja2.Jinja2'', ***1
''DIRS'': [os.path.join(BASE_DIR, ''templates'')], ''APP_DIRS'': False, ***2 ''OPTIONS'': { ''context_processors'': [ ''django.template.context_processors.debug'', ''django.template.context_processors.request'', ''django.contrib.auth.context_processors.auth'', ''django.contrib.messages.context_processors.messages'', ], ''environment'': ''APP_NAME.jinja2_env.environment'', ***3 }, }, ]
标 ***
的是需要修改的地方。
- ***1
:这里指定引擎为 jinja2
- ***2
:这里确保不去 app 下的子目录的 jinja2 目录找模板
- ***3
:配置环境,上边创建的 py 文件
这样一来,你的默认模板引擎就添加好了。
django-3.模板引擎
[TOC]
模板引擎DTL(django template language)
模板系统
- 两对花括号包围的文本( {{ 变量 }} )是变量,意思是“把指定变量的值插入这里”.
- 一对花括号和百分号包围的文本(如 {% 模板标签 %} )是模板标签
- 过滤器,这是调整变量格式:{{ 变量|过滤器:"参数" }}
- 内置模板标签和过滤器
使用模板系统
+ 编写模板字符串,创建 Template 对象,创建 Context 对象,然后调用 render() 方法。
+ 代码示例:
```
>>> from django import template
>>> t = template.Template(''My name is {{ name }}.'') # 创建模板对象
>>> c = template.Context({''name'': ''Nige''}) # 上下文(模板变量和相应的值)
>>> print (t.render(c)) # 渲染模板
My name is Nige.
```
+ 运行 python manage.py shell 启动交互式解释器,能在启动解释器之前,告诉Django 使用哪个设置文件,否则会抛异常
字典和上下文
-
多个上下文,同一个模板
>>> t = Template(''Hello, {{ name }}'') >>> print (t.render(Context({''name'': ''John''}))) Hello, John >>> print (t.render(Context({''name'': ''Julie''}))) Hello, Julie
-
点号可以访问字典的键、属性、方法或对象的索引,板系统遇到变量名中的点号时会按照下述顺序尝试查找如foo.bar,foo.2
- 字典查找(如 foo["bar"] )
- 属性查找(如 foo.bar )
- 方法调用(如 foo.bar() )
- 列表索引查找(如 foo[2] )
-
模板系统在变量处插入引擎的 string_if_invalid 配置选项,(默认为一个空字符串):
- 方法设定了 alters_data=True ,那么渲染模板时不会执行方法
- 方法查找的过程中,如果方法抛出异常,异常有 silent_variable_failure 属性,而且值为 True
- 如果变量不存在
## 基本的模板标签和过滤器
标签
-
if/else标签
- {% if ... %} 和 {% endif %}配对
- {% else %},{% elif %}
- {% if %} 支持使用 and 、 or 或 not, 优先级not,and,or,不能有括号
-
for标签
- {% for ... in ...%}和{% forend %}配对
- {% for ... in ... reversed %}反向迭代
- {% empty %}子句,可迭代对象为空,则执行其后语句
- {% for %} 循环内部,可以访问一个名为 forloop 的模板变量,其属性:
- forloop.counter 的值是一个整数,表示循环的次数。这个属性的值从 1 开始
- forloop.counter0 与 forloop.counter 类似,不过是从零开始的
- forloop.revcounter 的值是一个整数,表示循环中剩余的元素数量
- forloop.revcounter0 与 forloop.revcounter 类似,不过索引是基于零的
- forloop.first 是个布尔值,第一次循环时为 True
- forloop.last 是个布尔值,最后一次循环时为 True
- 在嵌套的循环中, forloop.parentloop 引用父级循环的 forloop 对象
-
ifequal/ifnotequal标签
- {% ifequal ... ...%} 标签比较两个值,如果相等,显示 {% ifequal %} 和 {% endifequal %} 之间的内容
- {% ifequal %} 标签支持可选的 {% else %} 子句
- {% ifequal %} 的参数只能是模板变量、字符串、整数和小数
- {% ifnotequal %} 测试两个参数是否不相等
-
注释
- 注释使用 {# #} 标明
- 多行注释{% comment %} ,{% endcomment %}
过滤器
+ {{ name|lower }}: lower 过滤器调整 {{ name }} 变量的值——把文本转换成小写
+ 过滤器可以串接:{{ my_list|first|upper }},获取列表中的第一个元素,然后将其转换成大写
+ 有些过滤器可以接受参数:{{ bio|truncatewords:"30" }},显示 bio 变量的前 30 个词
+ addslashes :在反斜线、单引号和双引号前面添加一个反斜线:{ value|addslashes }}
+ date :根据参数中的格式字符串格式化 date 或 datetime 对象:{{ pub_date|date:"F j, Y"}},
+ length :返回值的长度。对列表来说,返回元素的数量。对字符串来说,返回字符的数量。如果变量未定义,返回 0 。
模板加载机制
- settings.py 文件中, TEMPLATES 设置。它的值是一个列表,分别针对各个模板引擎,模板引擎是字典,有以下设置:
- BACKEND 的值是Python 路径,指向实现 Django 模板后端 API 的模板引擎类。内置的后端有 djan-go.template.backends.django.DjangoTemplates 和 django.template.backends.jinja2.Jinja2 。
- DIRS 定义一个目录列表,模板引擎按顺序在里面查找模板源文件
- APP_DIRS 设定是否在安装的应用中查找模板。按约定, APPS_DIRS 设为 True 时, DjangoTemplates 会在INSTALLED_APPS 中的各个应用里查找名为“templates”的子目录
- OPTIONS 是一些针对后端的设置
- 在项目根目录中放一些主模板(例如在 mysite/templates 目录中):
''DIRS'': [os.path.join(BASE_DIR, ''templates'')],
- 视图函数中使用模板加载机制
from django.template.loader import get_template
t = get_template(''current_datetime.html'') # 传入模块名称,返回模板对象
html = t.render(Context({''current_date'': now})) # 出现类型错误,需要字典dir对象而不是Context对象,去掉Context直接{''current_date'': now}或使用Context().update({''current_date'': now)
render()
- django.shortcuts 模块中 render()
- 加载模板、创建上下文、渲染模板和创建 HttpResponse 对象全由 render() 调用代替, render() 的返回值是一个 HttpResponse 对象
- 例子:
from django.shortcuts import render
import datetime
def current_datetime(request):
now = datetime.datetime.now()
return render(request, ''current_datetime.html'', {''current_date'': now})
render() 的第一个参数是请求对象,第二个参数是模板名称,第三个单数可选,是一个字段,用于创建传给模板的上下文。如果不指定第三个参数, render() 使用一个空字典。
- 把模板存储在模板目录的子目录里,只需在模板名称前面加上子目录的名称和一条斜线
return render(request, ''dateapp/current_datetime.html'', {''current_date'': now})
include模板标签
- {% include %},
{% include ''nav.html'' %}
- 作用是引入另一个模板的内容。它的参数是要引入的模板的名称,可以是变量,也可以是硬编码的字符串(放在引号里,单双引号都行)
模板继承
定义有区别的片段
- 父模板
{% block 块名称,用于区分块 %}子模板可以覆盖块的内容、向块中添加内容,或者原封不动。{% endblock %}
- 子模块
{% extends "父模板的名称" %} # 声明子模块,加载父模块,要出现在子模块的第一个模板标签,使用与 get_template() 相同的方法加载
{% block 要覆盖的块名称 %}覆盖的内容{% endblock %}
从父模板中的块里获取内容,使用 {{ block.super }} ,这是一个“魔法”变量,提供父模板中渲染后的文本。向块中添加内容,而不是完全覆盖时就可以这么做
今天的关于Golang模板引擎管道和golang 模板引擎的分享已经结束,谢谢您的关注,如果想了解更多关于django - 模板引擎进阶、Django 模板引擎以及模板、django 默认模板引擎和 jinja2 模板引擎、django-3.模板引擎的相关知识,请在本站进行查询。
本文标签: