Django之Template介绍及日常应用

Django模板语言

Django模板是一个简单的文本文档,或用Django模板语言标记的一个Python字符串。 某些结构是被模板引擎解释和识别的。主要的有变量和标签。模板是由context来进行渲染的。渲染的过程是用在context中找到的值来替换模板中相应的变量,并执行相关tags。其他的一切都原样输出。Django模板语言的语法包括四个结构。

Django 项目可以配置一个或多个模板引擎(甚至是零,如果你不需要使用模板)。Django 的模板系统自带内建的后台 —— 称为Django 模板语言(DTL),以及另外一种流行的Jinja2。其他的模板语言的后端,可查找第三方库。

配置

模板引擎通过TEMPLATES 设置来配置。它是一个设置选项列表,与引擎一一对应。默认的值为空。由startproject 命令生成的settings.py  定义了一些有用的值:

TEMPLATES = [

    {

        'BACKEND': 'django.template.backends.django.DjangoTemplates',

        'DIRS': [],

        'APP_DIRS': True,

        'OPTIONS': {

            # ... some options here ...

        },

    },

 ]

加载模板

get_template('news/story_detail.html')

1 变量(使用双大括号来引用变量)

{{ var_name }}

2 标签(tag)的使用(使用大括号和百分号组成来表示使用tag)

{% load staticfiles %}

3 过滤器(filter)的使用

{{ ship_date|date:"Fj,Y"}}

ship_date变量传给data过滤器,data过滤器通过使用Fj,Y这几个参数来格式化数据。|代表类似Unix命令中的管道操作。

 常用标签(tag)

1 {% if %}

可以使用and,or,not来组织你的逻辑,但不允许and和or同时出现的条件语句中。新版本已经支持{% elif %}这样的用法

2 {% ifequal %}和{% ifnotequal %}

比较是否相等,只限于简单的类型,比如字符串、整数、小数的比较,列表、字典、元组不支持。

3 {% for %}

用来循环一个list,还可以使用reserved关键字来进行倒序遍历,一般可以用if语句来西先判断一下列表是否为空,在进行遍历;还可以使用empty关键字来进行为空时候的跳转。

**for标签中可以使用forloop

forloop.counter: 当前循环计数,从1开始

forloop.counter0: 当前循环计数,从0开始

forloop.recounter: 当前循环倒数计数,从列表长度开始

forloop.recounter0: 当前循环倒数计数,从列表长度减1开始,标准

forloop.first: bool值,判断是不是循环的第一个元素

forloop.last: bool值,判断是不是循环的最后一个元素

forloop.parentloop: 用在嵌套循环中,得到parent循环的引用,然后可以使用以上参数

4 {% cycle %}

在循环是轮流使用给定的字符串列表中的值。

5 注释

{# #}单行注释,{% comment %}多行注释

6 {% csrf_token %}

生成csrf_token的标签,用于防止跨站攻击验证

7 {% debug %}

调用调试信息

8 {% filter %}

将filter标签标签圈定的执行过滤器操作

9 {% autoescape %}

自动转义设置

{{% autoescape off %}}

{{ value}}

{{% endautoescape %}}

10 {% firstof %}

输出第一个值不等于False的变量

11 {% load %}

加载标签库

12 {% now %}

获取当前的时间

13 {% spaceless %}

移除空格

14 {% url %}

引入路由配置的地址

15 {% verbatim %}

禁止render

16 {% with %}

用更简单的变量名缓存复制的变量名

常用过滤器(filter)

经常使用的是通过变量来调用过滤器)

1 add

给变量加上相应的值

{{ value|add:"2" }}    # 空格不要乱加

2 addslashes

给变量中的引号(双引号、单引号)前加上斜线

3 capfirst

首字母大写

4 cut

从字符串中移除指定的字符

{{ value|cut:" " }}

5 date

格式化日期字符串

6 default

如果值是False,就替换成设置的默认值,否则就使用本来的值(空字符串”“、空列表[]、空字典{}、空元组()、None在python里也是False)

7 default_if_none

如果只是None,就替换成设置的默认值,否则就使用本来的值

8 dictsort

按照设定的参数(key)对应的value对列表进行排序

9 dictsorted

和上面恰好相反

10 divisbleby

是否能够被某个数字整除,是的话返回True,否则返回False

11 escape

对字符串进行转义。django默认自动转义,如果我们关闭了自动转义,这可使用escape过滤器来转义。

12 escapejs

替换value中的某些字符,以适应JAVASCRIPT和JSON格式

13 filesizeformat

格式化文件大小显示

14 first

返回列表中的第一个值

15 last

返回列表中的最后一个值

16 floatformat

格式化浮点数

17 length

求字符串或者列表的长度

18 length_is

比较字符串或者列表的长度

19 urlencode

对URL进行编码处理

20 upper\lower

大写\小写

21 safe

对某个变量关闭自动转义

{{ value|safe }}

22 slice

切片操作

{{ some_list|slice:":2" }}

23 time

格式化时间

24 timesince

格式化时间(e.g. “4 days,6 hours”)

25 truncatechars

按照字符截取字符串

{{ value|truncatechars:5 }}

26 turncatewords

按照单词截取字符串(其实就是按照空格来截取)

27 striptags

过滤掉html标签

具体可以查看 内置过滤器参考和 开发自定义过滤器指南这两篇文档.

include模板

{% include 'included.html' %}标签允许在模板中包含其它的模板的内容。

模板继承

模板可以通过继承来实现复用。首先编写base.html

<html>

  <head>

    <title>Hello World!</title>

  </head>

  <body>

    {% block mainbody %}

      <p>base</p>

    {% endblock %}

  </body>

</html>

{% block %}标签通知模板引擎,子模板可以重写这些部分。

{% extends "base.html" %}

{% block mainbody %}

    <p>extends base</p>

{% endblock %}

模版继承可以让您创建一个基本的“骨架”模版,它包含您站点中的全部元素,并且可以定义能够被子模版覆盖的 blocks 。

加载器

模板加载器负责定位模板,加载它们,并返回模板对象.

Django提供几个内置的模板加载器并且支持自定义的模板加载器.

上下文处理器

Context处理器是这样的函数:接收当前的 HttpRequest 作为参数,并返回一个 字典,该字典中包含了将要添加到渲染的context中的数据。

它们的主要用途是添加所有的模板context共享的公共数据,而不需要在每个视图中重复代码。

Django提供了很多 内置的context处理器 . 实现自定义context处理器很简单,只要定义一个函数。

大家使用Django的模板的时候可能都用过{{request.user}}来获取登录的用户或者判断是否登录呢?那大家有没有想过,我们调用render方法的时候并没有把request对象作为参数传给模板啊,为什么就可以直接调用呢?答案就是Django默认自带了一些context_processors帮我们把request对象传给模板,我们来看一下settings.py这一段代码

TEMPLATES = [

{

'BACKEND': 'django.template.backends.django.DjangoTemplates',

'DIRS': [os.path.join(BASE_DIR, 'templates')]

,

'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',

],

},

},

]

这里面的context_processors就是配置模板有哪些context_processors可以使用。其中django.template.context_processors.request就是帮我们把request传递给模板的,我们来看一下

def request(request):

return {'request': request}

可以看到,首先context_processors就是一个函数,其次,这个函数默认接受一个参数,也就是request,最后,返回的对象是一个字典,字典的key就是我们在模板里面可以调用的一个上下文。

那么我们来建一个自己的context_processors

创建context_processors

首先我们在自己app里创建一个context_processors.py的文件(模块),文件名虽然不是强制要求,但作为规范,建议还是按照规范来

然后里面实现一个context_processors的函数,比如我们就是把settings里的某一个参数作为上下文返回,可以这样写

from django.conf import settings # import the settings file

def site_name(request):

# return the value you want as a dictionnary. you may add multiple values in there.

return {'SITE_NAME': settings.SITE_NAME}

说明:settings.SITE_NAME是一个自定义的配置,默认并不存在,需要我们手动写。另外可以返回多个值,只要配置多个key和value对儿就可以了。

注意:request形参必须有,尽管多数用不到。

配置context_processors

接下来就可以把我们自定义的context_processors添加到配置文件中

TEMPLATES = [

接下来就可以把我们自定义的context_processors添加到配置文件中

TEMPLATES = [

{

...

'OPTIONS': {

说明:blog是这个例子的应用名,根据自己的项目做相应修改。

注意:别忘了配置SITE_NAME哦。

大功告成

这样我们就可以在我们的模板通过{{SITE_NAME}}等方式调用这个参数了

'context_processors': [

...

'blog.context_processors.site_name',

],

},

},

]


...

SITE_NAME = "社区"

{

...

'OPTIONS': {

'context_processors': [

...

'blog.context_processors.site_name',

],

},

},

]


...

SITE_NAME = "社区"

说明:blog是这个例子的应用名,根据自己的项目做相应修改。

注意:别忘了配置SITE_NAME哦。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,417评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,921评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,850评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,945评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,069评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,188评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,239评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,994评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,409评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,735评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,898评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,578评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,205评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,916评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,156评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,722评论 2 363
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,781评论 2 351

推荐阅读更多精彩内容