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 与静态文件的路径进行映射。

 

Tags: