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前端网发表,如需转载,请注明页面地址。
code前端网
