Django模板应用示例(基于MVC思想)
使用django.http.HttpResponse()输出“Hello World!”。这种方式将数据和视图结合在一起,不符合Django的MVC思想。
本章我们将详细介绍Django模板的应用。模板是用于分隔文档的演示形式和内容的文本。
模板应用示例
我们将继续上一章的项目,在HelloWorld目录中创建一个模板目录,并创建一个hello.html文件。整个目录结构如下:
HelloWorld/ |-- HelloWorld | |-- __init__.py | |-- __init__.pyc | |-- settings.py | |-- settings.pyc | |-- urls.py | |-- urls.pyc | |-- view.py | |-- view.pyc | |-- wsgi.py | `-- wsgi.pyc |-- manage.py `-- templates `-- hello.html
hello.html 文件代码如下:
<h1>{{ hello }}</h1>
从模板中我们知道,变量使用双括号。
接下来我们需要解释Django的模板文件路径,编辑HelloWorld/settings.py并将TEMPLATES中的DIRS编辑为[BASE_DIR+"/templates",]如下:,
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [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', ], }, }, ]
现在我们编辑view.py 并添加一个新对象以将数据发送到模板:
# -*- coding: utf-8 -*- #from django.http import HttpResponse from django.shortcuts import render def hello(request): context = {} context['hello'] = 'Hello World!' return render(request, 'hello.html', context)
正如您所看到的,这里我们使用 render 来替换之前使用的 HttpResponse。render还使用字典上下文作为参数。
上下文字典中键“hello”元素的值对应于模板中的变量“{{ hello }}”。
重新访问http://192.168.45.3:8000/hello/,可以看到页面:
这样我们就完成了使用模板输出数据,实现了数据和视图的分离。
接下来我们详细介绍一下模板中常用的语法规则。
Django 模板标签
if/else 标签
基本语法格式如下:
{% if condition %} ... display {% endif %}
or:
{% if condition1 %} ... display 1 {% elif condiiton2 %} ... display 2 {% else %} ... display 3 {% endif %}
根据条件判断是否给出输出。 if/else 支持嵌套。
{% if tag %} 接受关键字或关键字来评估多个变量或反转变量(否),例如:
{% if athlete_list and coach_list %} athletes 和 coaches 变量都是可用的。 {% endif %}
for tag
{% for %} 是允许的 我们迭代序列。
与 Python 的 for 语句类似,循环语法为 for X in Y ,其中 Y 是要重复的序列,X 是每个特定循环中使用的变量的名称。
每次循环通过时,模板系统都会渲染 {% for %} 和 {% endfor %} 之间的所有内容。
例如,如果我们将运动员列表放入到 attendee_list 变量中,我们可以使用以下代码来显示该列表:
<ul> {% for athlete in athlete_list %} <li>{{ athlete.name }}</li> {% endfor %} </ul>
向标签添加逆元素以重复列表:
{% for athlete in athlete_list reversed %} ... {% endfor %}
可以使用嵌套{% for %} 标签: 标签 标签 ifequal/ifnotequal
{% ifequal %} 标签比较两个值,当相等时,显示 {% ifequal %} 和 {% endifequal 之间的所有值%}。
以下示例比较两个模板变量 user 和 currentuser:
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
与 {% if %} 类似,{% ifequal %} 支持可选的 {% else%} 标签: 8
{% ifequal section 'sitenews' %} <h1>Site News</h1> {% else %} <h1>No News Here</h1> {% endifequal %}
注释标签
评论使用{# #}。
{# 这是一个注释 #}
过滤器
模板过滤器可以在显示变量之前对其进行修改。过滤器使用竖线字符,如下所示:
{{ name|lower }}
{{ name }} 变量经过下面的过滤器处理后,文档转换文本为小写。
过滤器管道可以*嵌套*,即一个过滤器管道的输出可以用作下一个过滤器管道的输入:
{{ my_list|first|upper }}
上面的示例采用第一个元素并将其转换为大写。
有些过滤器有参数。过滤器参数后面是冒号,并且始终用引号引起来。例如:
{{ bio|truncatewords:"30" }}
将显示bio 变量的前30 个单词。
其他过滤器:
- addslashes :在任何反斜杠、单引号或双引号之前添加反斜杠。
- date:根据指定的格式字符串参数格式化日期或日期时间对象。示例:
{{ pub_date|date:"F j, Y" }}
- length:返回变量的长度。
include标签
{% include %}标签允许将其他模板的内容包含在模板中。
以下两个示例包含 nav.html 模板:
{% include "nav.html" %}
模板继承
可以通过继承重用模板。
接下来我们首先在上一个项目的template目录下创建base.html文件。代码如下:
<html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>
在上面的代码中,名为mainbody的块标签是可以被后继替换的部分。
所有的 {% block %} 标签告诉模板引擎子模板可以覆盖这些部分。
hello.html继承base.html并替换特定块。修改后的hello.html代码如下:
{% extends "base.html" %} {% block mainbody %} <p>继承了 base.html 文件</p> {% endblock %}
第一行代码表示hello.html继承了base.html文件。可以看到,这里使用了同名的block标签来替换base.html中对应的block。
重新访问地址http://192.168.45.3:8000/hello/,结果如下:
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。