Code前端首页关于Code前端联系我们

Django模板应用示例(基于MVC思想)

terry 2年前 (2023-09-25) 阅读数 46 #后端开发

使用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 模板的应用实例(基于MVC思想)

这样我们就完成了使用模板输出数据,实现了数据和视图的分离。

接下来我们详细介绍一下模板中常用的语法规则。


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/,结果如下:

Django 模板的应用实例(基于MVC思想)

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门