首页 > temp > python入门教程 >
-
Django-模板
定义
DTL(django Tempalte language)是Django自带的模板语言。 Django支持Jinja2等其他模板引擎。DTL模板是一种带有特殊语法的HTML文件,可以被Django编译,产地参数,实现数据动态化。在编译完成后,生成一个普通的HTML文件,然后发送给客户端。
在 Django 中提供了 render ,直接将模板渲染成字符串和包装成HttpResponse对象。views 下的示例如下:
def index(request): return render(request,'index.html')
模板查找顺序
新添加的 app 需要在 settings 进行注册:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'book', ]
模板文件查找:
首先会在项目的 templates 下查找。
其次在自己所在的 app下的 templates 中查找。
最后在其他的 app下 查找。
如果下面的代码中的 APP_DIRS 的值为 False,则不会在 app下进行查找,只会在项目的 templates 下查找。
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ]
参数传递
在 render 中有context 参数作为参数的传递。
例如 views 为:
def index(request): context = { 'username': 'ty' } return render(request,'index.html', context=context)
在html中使用两个大括号{{ "变量" }} 进行引用:
<body>
{{ username }}
</body>
如果是有层级关系,例如类中的变量,则可以使用点 class.value 进行获取。
例如字典,也可以使用点进行获取 dict.key 。但是如果使用 dict.keys 获取到的是字典的所有 key。不能通过中括号[]的形式进行获取。
例如列表,可以使用下标进行获取 list.index 。元组也是一样的。
常用标签
if 标签:也可以结合 else 一起使用,但是需要有结束表示 endif,可以使用基本运算符 == ,!=, >= 等。
{% if number < 1 %} <p>小于1</p> {% if number == 1 %} <p>等于1</p> {% else %} <p>大于1</p> {% endif %}
for 标签:与 Python 的 for 语句的情形类似,循环语法是 for X in Y ,Y 是要迭代的序列而 X 是在每一个特定的循环中使用的变量名称。每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容。
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
url标签
url 后面的为 path 中的 name 值。
<a href="{ % url 'urlname' % }"></a>
也可以在 url 中添加参数:
<a href="{ % url 'urlname' id='3' % }"></a>
过滤器
在DTL中不支持函数的调用形式,因此不能给函数传递参数。而过滤器其实就是一个函数,可以对需要处理的参数进行处理,并且可以额外接收一个参数。
add: 将传进来的参数添加到原来的值上面。
{{ value|add:'3' }}
cut: 移除字符串,类似于 replace 函数。
{{ value|cut:" " }}
date:日期格式,将一个日期按照制定格式,格式化成字符串。
# 数据 context = { ”birthday“:datetiem.now() } # 模板 {{ birthday|date:"Y/m/d" }}
其他时间格式化的方式。
格式字符 |
描述 |
示例 |
Y |
四位数字的年份 |
2018 |
m |
两位数字的月份 |
01-12 |
n |
月份,1-9前面没有0前缀 |
1-12 |
d |
两位数字的天 |
01-31 |
j |
天,但是1-9前面没有0前缀 |
1-31 |
g |
小时,12小时格式的,1-9前面没有0前缀 |
1-12 |
h |
小时,12小时格式的,1-9前面有0前缀 |
01-12 |
G |
小时,24小时格式的,1-9前面没有0前缀 |
1-23 |
H |
小时,24小时格式的,1-9前面有0前缀 |
01-23 |
i |
分钟,1-9前面有0前缀 |
00-59 |
s |
秒,1-9前面有0前缀 |
00-59 |
其他过滤器
过滤器 | 说明 |
---|---|
addslashes | 添加斜杠 |
capfirst | 首字母大写 |
center | 文本居中 |
default | 设置默认值 |
default_if_none | 为None设置默认值 |
dictsort | 字典排序 |
dictsortreversed | 字典反向排序 |
divisibleby | 整除判断 |
escape | 转义 |
escapejs | 转义js代码 |
filesizeformat | 文件尺寸人性化显示 |
first | 第一个元素 |
floatformat | 浮点数格式化 |
force_escape | 强制立刻转义 |
get_digit | 获取数字 |
iriencode | 转换IRI |
join | 字符列表链接 |
last | 最后一个 |
length | 长度 |
length_is | 长度等于 |
linebreaks | 行转换 |
linebreaksbr | 行转换 |
linenumbers | 行号 |
ljust | 左对齐 |
lower | 小写 |
make_list | 分割成字符列表 |
phone2numeric | 电话号码 |
pluralize | 复数形式 |
pprint | 调试 |
random | 随机获取 |
rjust | 右对齐 |
safe | 安全确认 |
safeseq | 列表安全确认 |
slice | 切片 |
slugify | 转换成ASCII |
stringformat | 字符串格式化 |
striptags | 去除HTML中的标签 |
time | 时间格式化 |
timesince | 从何时开始 |
timeuntil | 到何时多久 |
title | 所有单词首字母大写 |
truncatechars | 截断字符 |
truncatechars_html | 截断字符 |
truncatewords | 截断单词 |
truncatewords_html | 截断单词 |
unordered_list | 无序列表 |
upper | 大写 |
urlencode | 转义url |
urlize | url转成可点击的链接 |
urlizetrunc | urlize的截断方式 |
wordcount | 单词计数 |
wordwrap | 单词包裹 |
yesno | 将True,False和None,映射成字符串‘yes’,‘no’,‘maybe’ |
模板继承
编写一个公共 html 文件,在子模板中继承公共模块即可达到复用的目的。在子模块中使用 { % extends 'xxx.html' % }
在公共 html 文件中,可以使用 block 作为一个接口,进行对公共模块区域的内容进行填充。填充后会覆盖公共模块 block 中内容。
# 公共模块,block后面为block名称 {% block blockname %} {% endblock %} # 子模块 { % extends 'xxx.html' % } {% block blockname %} {% endblock %}
如果公共模块中 block 中有部分内容不希望被覆盖,则可添加 block.super 进行标识。
# 公共模块,block后面为block名称 {% block blockname %} {{ block.super }} 这是不会被覆盖的代码 {% endblock %}
加载静态文件
1、确保 django.contrib.staticfiles 已经添加到settings中的INSTALLED_APPS
2、确保settings中设置了 STATIC_URL = '/static/'
3、在已经安装了的 app 下创建一个文件夹叫 static
4、如果一些静态文件是不和任何app挂钩的,可以在 settings 中添加 STATICFILES_DIRS
STATICFILES_DIRS = [ os.path.join(BASE_DIR, "static") ]
5、在模板中使用 load 标签加载 static 标签。
{% load static %} <link rel="stylesheet" href="{ % static 'style.css' % }">
6、如果不想每次在模板中加载静态文件使用 load 加载 static 标签,那么可以在 settings 中的 TEMPLATES/OPTIONS 中添加内置标签,builtins
'builtins':['django.templatetags.static']
7、如果没有在 settings 下的 INSTALLED_APPS 中添加 django.contrib.staticfiles ,那么需要手动将请求静态文件的 url 与静态文件的路径进行映射。
出处:https://www.cnblogs.com/tynam/p/13983514.html