被解放的姜戈03 所谓伊人

简介: 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!   在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()。

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

 

在之前的程序中,我们直接生成一个字符串,作为http回复,返回给客户端。这一过程中使用了django.http.HttpResponse()

在这样的一种回复生成过程中,我们实际上将数据和视图的格式混合了到上面的字符串中。看似方便,却为我们的管理带来困难。想像一个成熟的网站,其显示格式会有许多重复的地方。如果可以把数据和视图格式分离,就可以重复使用同一视图格式了。

Django中自带的模板系统,可以将视图格式分离出来,作为模板使用。这样,不但视图可以容易修改,程序也会显得美观大方。

“她是我心中最美的人”,姜戈对德国人说。

 

模板初体验

我们拿一个独立的templay.html文件作为模板。它放在templates/west/文件夹下。文件系统的结构现在是:

mysite/
├── mysite
├── templates
│   └── west
└── west

 

templay.html文件的内容是:

<h1>{{ label }}</h1>

可以看到,这个文件中,有一个奇怪的双括号包起来的陌生人。这就是我们未来数据要出现的地方。而相关的格式控制,即<h1>标签,则已经标明在该模板文件中。

 

我们需要向Django说明模板文件的搜索路径,修改mysite/settings.py,添加:

# Template dir
TEMPLATE_DIRS = (
    os.path.join(BASE_DIR, 'templates/west/'),
)

如果还有其它的路径用于存放模板,可以增加该元组中的元素,以便Django可以找到需要的模板。

 

我们现在修改west/views.py,增加一个新的对象,用于向模板提交数据:

# -*- coding: utf-8 -*-

#from django.http import HttpResponse
from django.shortcuts import render

def templay(request):
    context          = {}
    context['label'] = 'Hello World!'
    return render(request, 'templay.html', context)

可以看到,我们这里使用render来替代之前使用的HttpResponse。render还使用了一个词典context作为参数。这就是我们的数据。

context中元素的键值为'label',正对应刚才的“陌生人”的名字。这样,该context中的‘label’元素值,就会填上模板里的坑,构成一个完整的http回复。

 

作为上节内容的一个小练习,自行修改west/urls.py,让http://127.0.0.1:8000/west/templay的URL请求可以找到相应的view对象。

 

访问http://127.0.0.1:8000/west/templay,可以看到页面:

 

“我给你讲个故事吧,勇士拯救公主的故事”,德国人说。

 

流程

再来回顾一下整个流程。west/views.py中的templay()在返回时,将环境数据context传递给模板templay.html。Django根据context元素中的键值,将相应数据放入到模板中的对应位置,生成最终的http回复。

这一模板系统可以与Django的其它功能相互合作。上一回,我们从数据库中提取出了数据。如果将数据库中的数据放入到context中,那么就可以将数据库中的数据传送到模板。

修改上次的west/views.py中的staff:

def staff(request):
    staff_list  = Character.objects.all()
    staff_str  = map(str, staff_list)
    context   = {'label': ' '.join(staff_str)}
    return render(request, 'templay.html', context)

 

练习: 显示上面的staff页面。

 

“勇士翻过高山,并非因为他不害怕。”

 

循环与选择

Django实际上提供了丰富的模板语言,可以在模板内部有限度的编程,从而更方便的编写视图和传送数据。

我们下面体验一下最常见的循环与选择。

 

上面的staff中的数据实际上是一个数据容器,有三个元素。刚才我们将三个元素连接成一个字符串传送。

实际上,利用模板语言,我们可以直接传送数据容器本身,再循环显示。修改staff()为:

def staff(request):
    staff_list = Character.objects.all()
    return render(request, 'templay.html', {'staffs': staff_list})

从数据库中查询到的三个对象都在staff_list中。我们直接将staff_list传送给模板。

将模板templay.html修改为:

{% for item in staffs %}
<p>{{ item.id }}, {{item}}</p>
{% endfor %}

我们以类似于Python中for循环的方式来定义模板中的for,以显示staffs中的每个元素。

还可以看到,对象.属性名的引用方式可以直接用于模板中。

 

选择结构也与Python类似。根据传送来的数据是否为True,Django选择是否显示。使用方式如下:

{% if condition1 %}
   ... display 1
{% elif condiiton2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

其中的elif和else和Python中一样,是可以省略的。

 

“勇士屠杀恶龙,并非因为他不恐惧。”

 

模板继承

模板可以用继承的方式来实现复用。我们下面用templay.html来继承base.html。这样,我们可以使用base.html的主体,只替换掉特定的部分。

新建templates/west/base.html:

<html>
  <head>
    <title>templay</title>
  </head>

  <body>
    <h1>come from base.html</h1>
    {% block mainbody %}
       <p>original</p>
    {% endblock %}
  </body>
</html>

该页面中,名为mainbody的block标签是可以被继承者们替换掉的部分。

 

我们在下面的templay.html中继承base.html,并替换特定block:

{% extends "base.html" %}

{% block mainbody %}

{% for item in staffs %}
<p>{{ item.id }},{{ item.name }}</p>
{% endfor %}

{% endblock %}

第一句说明templay.html继承自base.html。可以看到,这里相同名字的block标签用以替换base.html的相应block。

 

“勇士穿过地狱火焰,因为,她值得。”

 

总结

使用模板实现视图分离。

数据传递,模板变量,模板循环与选择,模板继承。

 

姜戈静静的说,“我懂得他的感受。”

 

欢迎阅读“被解放的姜戈”系列文章。

 

目录
相关文章
|
5月前
|
运维 监控
运维自动化:解放双手,提升效率
【8月更文挑战第20天】在数字化时代,运维工作的重要性日益凸显。然而,传统的运维方式往往需要大量的人力投入,且容易出错。本文将探讨如何通过运维自动化来解放双手,提升工作效率。我们将从运维自动化的概念、优势、实施步骤以及注意事项等方面进行详细阐述。
|
16天前
|
存储 监控 数据可视化
必看!J 人电商团队圣诞冲刺,哪 6 款办公软件是工作学习效率的神器?
随着圣诞节临近,电商零售行业迎来购物狂欢。高效的团队协作和个人学习效率是关键。本文推荐6款可视化团队协作软件:板栗看板、Asana、Miro、monday.com、Wrike和Notion。这些工具能直观呈现工作流程,促进沟通与协作,提升工作效率。板栗看板任务清晰,Asana规划细致,Miro创意无限,monday.com自动化高效,Wrike资源管理精准,Notion一体化便捷。选择合适的工具,助力团队在圣诞季取得佳绩。
58 1
|
1月前
|
存储 数据可视化 搜索推荐
教育团队协作效率飙升,六款软件究竟在哪?
教育教培行业需高效管理学生作业以提升教学质量。为此,J人主导的教育团队可通过六款可视化团队协作办公软件优化作业管理流程:板栗看板、Notion、ClickUp、Airtable、Slack。这些软件分别在作业流程呈现、任务分配、资源整合、沟通协作及数据分析等方面展现出色,有助于构建条理化、个性化的作业管理体系,满足教育团队的高效管理需求。
46 3
|
29天前
|
数据可视化 数据挖掘 项目管理
从头到尾掌控项目,了解全流程协作的力量
在现代企业中,全流程协作理念通过从任务发起至结果交付的全生命周期透明化、标准化和高效化,打破部门、团队和工具间的壁垒,提高团队透明度,打破时空限制,降低跨部门沟通成本,赋能团队持续优化。
|
2月前
|
监控 数据可视化 搜索推荐
轻松搞定项目管理!用对在线项目管理工具助你生产力翻倍!
在线项目管理通过互联网平台和相关软件工具,打破时空限制,实现项目全过程的高效管理。本文介绍了五款在线项目管理工具:板栗看板、MeisterTask、Slack、Microsoft Project 和 ClickUp,分别适用于不同场景和需求,如直观可视化、沟通协作、大型复杂项目和高度自定义等。
|
2月前
|
存储 数据可视化 数据挖掘
高效电商运营的秘密:从繁琐中解放,专注创收
电商运营工作繁琐且重复,容易分散精力,影响创收效率。借助 Leangoo,可实现任务清晰化管理、时间节点精准把控和任务进展高效追踪。例如,通过看板管理“双11活动复盘”,覆盖数据汇总、问题分析和优化建议,确保任务清晰透明。Leangoo 帮助团队从琐碎中解放,专注创收与创新,是电商运营提效的得力工具。
|
7月前
|
运维 监控 安全
自动化运维:解放双手,提升效率
【6月更文挑战第19天】本文将深入探讨自动化运维的重要性和优势,以及如何实现自动化运维。我们将从自动化运维的定义开始,然后讨论它的优势,包括提高效率、减少错误、节省成本等。接下来,我们将详细介绍如何实现自动化运维,包括选择合适的工具和技术、设计自动化流程、测试和优化等步骤。最后,我们将通过一个实际案例来展示自动化运维的实施过程和效果。
|
运维 监控 Cloud Native
运维自动化:提高效率的秘诀
运维自动化:提高效率的秘诀
195 0
|
8月前
|
监控 供应链 安全
解放生产力:项目管理软件的神奇作用大揭秘!
项目管理软件是整合了项目管理理论的计算机系统,用于协助团队规划、执行和监控项目,提高效率、促进沟通、风险管理及监控进度。PMI、IPMA和Gartner对其有不同定义,强调其在协作、计划制定和沟通中的角色。软件提供统一平台,确保项目按时间表、预算和质量标准推进,通过自动化工作流、沟通模块和风险管理功能增强团队合作。选择软件时要考虑团队规模、行业需求、易用性和安全性。
60 0
|
负载均衡 算法 搜索推荐
一文论重复性工作中如何培养匠心
匠心来自于重复性工作,但重复性工作未必一定培养出匠心。
62459 20

热门文章

最新文章