47.1、django 模板系统介绍:

1、说明:

我们可以直接将 HTML 硬编码到视图的python代码里,尽管这种技术便于解释视图是如何工作的,但却并不是一个好主意。

def current_datetime(request):

now = datetime.datetime.now()

html = "<html><body>It is now %s.</body></html>" %now

return HttpResponse(html)

对页面设计进行的任何改变都必须对 Python 代码进行相应的修改。 站点设计的修改往往比底层 Python 代码的修改要频繁

得多,因此如果可以在不进行 Python 代码修改的情况下变更设计,那将会方便得多。Python 代码编写和 HTML 设计是两

项不同的工作,大多数专业的网站开发环境都将他们分配给不同的人员,甚至不同部的门来完成。设计者和 HTML/CSS 的编

码人员不应该被要求去编辑 Python 的代码来完成他们的工作。程序员编写 Python 代码和设计人员制作模板两项工作同时

进行的效率是最高的,远胜于让一个人等待另一个人完成对某个既包含 Python又包含 HTML 的文件的编辑工作。基于这些

原因,将页面的设计和 Python 的代码分离开会更干净简洁,更容易维护。我们可以使用 Django 的模板系统 Template System

来实现这种模式。

2、模板的组成:

HTML代码+逻辑控制代码

47.2、逻辑控制代码的组成:

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

(1)语法格式:

{{ var_name }}

(2)通过视图函数传递参数到 template .html 文件:

1)views.py:

def current_time(request):

now=datetime.datetime.now()

return render(request, 'current_datetime.html', {'current_date':now})

2)current_datetime.html:

{{ current_date }}

(3)深度变量查找,万能的句点符:

模板系统能够非常简洁地处理更加复杂的数据结构,例如 list、dictionary 和自定义的对象。

在 Django 模板中遍历复杂数据结构的关键是句点字符 (.)。

(4)变量的过滤器,filter的使用:

1)语法格式:

{{ obj|filter:param }}

2)参数:

add:给变量加上相应的值

addslashes:给变量中的引号前加上斜线

capfirst:首字母大写

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

date:格式化日期字符串

default:如果值是 False 就替换成设置的默认值,否则就是用本来的值

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

3)示例:

A、

value1="aBcDe"

{{ value1|upper }}

#ABCDE

B、

value2=5

{{ value2|add:"3" }}

#8

C、

value3='he llo wo r ld'

{{ value3|cut:' ' }}

#helloworld

D、

import datetime

value4=datetime.datetime.now()

{{ value4|date:'Y-m-d' }}

#2019-12-25

E、

value5=[]

{{ value5|default:'空的' }}

#空的

F、

value6='<a href="#">跳转</a>'

{{ value6 }}

#<a href="#">跳转</a>

{% autoescape off %}

{{ value6 }}

{% endautoescape %}

#跳转(是一个 302 重定向超链接)

{{ value6|safe }}

#跳转(是一个 302 重定向超链接)

{{ value6|striptags }}

#跳转(字符串)

G、

value7='1234'

{{ value7|filesizeformat }}

#1.2 KB

{{ value7|first }}

#1

{{ value7|length }}

#4

{{ value7|slice:"::-1" }}

#4321

{{ value7|slice:"3" }}

#123

{{ value7|slice:"-3" }}

#1

H、

value8='http://www.baidu.com/?a=1&b=3'

{{ value8|urlencode }}

http%3A//www.baidu.com/%3Fa%3D1%26b%3D3

I、

value9='hello I am lc'

{{ value9|truncatechars:'10' }}

#hello I a…

{{ value9|truncatewords:'2' }}

#hello I …

2、标签tag的使用(使用大括号和百分比的组合来表示):

(1)语法格式:

{% tags %}

(2){% if %} 的使用:

1)说明:

{% if %} 标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值,系统则会显示{% if %}和{% endif %}间的所有内容

{% if %} 标签接受and,or或者not来测试多个变量值或者否定一个给定的变量。

{% if %} 标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义,例如下面的标签是不合法的:

{% if obj1 and obj2 or obj3 %}

2)示例:

{% if num >= 100 %}

{% if num > 200 %}

<p>num大于200</p>

{% else %}

<p>num大于100小于200</p>

{% endif %}

{% elif num < 100 %}

<p>num小于100</p>

{% else %}

<p>num等于100</p>

{% endif %}

(3){% for %} 的使用:

1)说明:

{% for %}标签允许你按顺序遍历一个序列中的各个元素,每次循环模板系统都会渲染{% for %}和{% endfor %}之间的所有内容。

2)代码:

<ul>

{% for obj in list %}

<li>{{ obj.name }}</li>

{% endfor %}

</ul>

提示:在标签里添加reversed来反序循环列表,{% for obj in list reversed %}

(4){% csrf_token %} 的使用:

1)说明:

用于生成csrf_token的标签,用于防治跨站攻击验证。注意如果你在view的index里用的是render_to_response方法,不会

生效,其实这里是会生成一个input标签,和其他表单标签一起提交给后台的。

2)代码:

<form action="" method="post">

{% csrf_token %}

......

</form>

(5){% url %} 的使用:

1)说明:

引用路由配置的地址,用于路由配置别名。

2)代码:

<form action="{% url "bieming"%}" method=""post>

<input type="text">

<input type="submit" value="提交">

{%csrf_token%}

</form>

(6){% with %} 的使用:

1)说明:

用更简单的变量名替代更复杂的变量名。

2)代码:

{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}

(7){% verbatim %} 的使用:

1)说明:

禁止render。

2)代码:

{% verbatim %}

{{ hello }}

{% endverbatim %}

(8){% load %} 的使用:

1)说明:

加载标签库。

2)代码:

<head>

<meta charset="UTF-8">

<title>Title</title>

{% load staticfiles %}

</head>

<script type="text/javascript" src={% static "jquery-3.1.1.js" %}></script>

(9){% comment %} 的使用:

1)说明:

用于模板代码的多行注释,其中单行注释为 {# <要注释的内容> #}。

2)代码:

{% comment %}

......

{% endcomment %}

(10)补充:

filter可以用在if等语句之后,类如下代码:

{% if num|filter_multi:30 > 100 %}

{{ num|filter_multi:30 }}

{% endif %}

3、extend模板继承:

(1)说明:

本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载。

你可以对那些不同的代码段进行定义,而不是共同代码段。

(2)代码:

1)第一步:

定义基础模板base.html文件保存到template目录下,该框架之后将由子模板所继承。base.html 的模板定义了一个简

单的 HTML 框架文档,我们将在本站点的所有页面中使用。 子模板的作用就是重载、添加或保留那些块的内容。我 们

使用模板标签 {% block %},所有的 {% block %} 标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子

模板覆盖。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html lang="en">

<head>

<title>{% block title %}{% endblock %}</title>

</head>

<body>

<h1>My helpful timestamp site</h1>

{% block content %}{% endblock %}

{% block footer %}

<hr>

<p>Thanks for visiting my site</p>

{% endblock %}

</body>

</html>

2)第二步:

继承模板。

{% extends "base.html" %}

{% block title %}The current time{% endblock %}

{% block content %}

<p>It is now {{ current_date }} </p>

{% endblock %}

继承模板后得到的结果为:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html lang="en">

<head>

<title>The current time</title>

</head>

<body>

<h1>My helpful timestamp site</h1>

<p>It is now {{ current_date }}</p>

<hr>

<p>Thanks for visiting my site</p>

</body>

</html>

(3)模板继承注意事项:

1)如果在模板中使用 {% extends %} ,必须保证其为模板中的第一个模板标记。 否则,模板继承将不起作用。

2)一般来说,基础模板中的 {% block %} 标签越多越好。 记住,子模板不必定义父模板中所有的代码块,因

此你可以用合理的缺省值对一些代码块进行填充,然后只对子模板所需的代码块进行(重)定义。 俗话说,钩

子越多越好。

3)如果发觉自己在多个模板之间拷贝代码,你应该考虑将该代码段放置到父模板的某个 {% block %} 中。如果

你需要访问父模板中的块的内容,使用 {{ block.super }} 这个标签,这一个魔法变量将会表现出父模板中的内

容。如果只想在上级代码块基础上添加内容,而不是全部重载,该变量就显得非常有用了。

{% block test.super %}

<只会显示父模板中的内容,即使这里写了内容也不会覆盖父模板中的内容>

{% endblock %}

4)不允许在同一个模板中定义多个同名的 {% block %} 。 存在这样的限制是因为 block 标签的工作方式是双

向的。也就是说,block 标签不仅挖了一个要填的坑,也定义了在父模板中这个坑所填充的内容。如果模板中

出现了两个相同名称的 {% block %} 标签,父模板将无从得知要使用哪个块的内容。

47、django工程(template)的更多相关文章

  1. Django工程的建立以及小网站的编写

    这篇博文会详细的介绍如何创建django工程,介绍我如何做了第一个网站.本文基于windows7安装了python2.7.12,Django1.8.18(LTS)版.采用的IDE为pycharm.建议 ...

  2. 六、Django之Template

    一.Template由来 1.任何前端页面的改动都和后端有关: 2.前端HTML和后端python分开能让网站更加清晰: 3.前后端分离的趋势下,专业的事交给专业的人做. 二.Django中的temp ...

  3. Django——模版Template报错

    >>> from django.template import Template >>> t = Template("My name is {{ my_n ...

  4. Django工程读取mongodb并使用分页器

    pycharm开发django工程(二) 项目需求: 1. 从mongodb中读取数据,并显示到网页中 2. 在网页显示的每一页加入分页符 首先使用pycharm的企业版新建一个django的虚拟工程 ...

  5. Django之Template

    模板层(template) 概念:  模板与html的区别:  模板=html+模板语法 模板语法: 1 变量:       {{}}    深度查询: 通过句点符.    列表,字典    clas ...

  6. django模板(template)

    模板层(template) 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. 1 2 3 4 def current_datetime ...

  7. Django工程搭建

    -----环境安装 1.创建虚拟环境 mkvirtualenv django_py3_1.11 -p python3   2.安装django pip install django==1.11.11 ...

  8. python web框架 django 工程 创建 目录介绍

    # 创建Django工程django-admin startproject [工程名称] 默认创建django 项目都会自带这些东西 django setting 配置文件 django可以配置缓存 ...

  9. django学习笔记【001】django版本的确定&创建一个django工程

    2.3 查看当前的django版本 python3. -m django --version 2.3.1 创建一个django工程 django-admin startproject mysite 在 ...

  10. Django工程目录结构优化

    1.我看到这篇文章,写的不错,在此复制了一份,防止以后找不到! 感谢作者的翻译--->原文的链接:http://www.loonapp.com/blog/11/ 如果原文存在,请打开原文件阅读 ...

随机推荐

  1. 消息队列之 RabbitMQ【验证通过】

    消息队列之 RabbitMQ 预流 关注  22.9 2017.05.06 16:03* 字数 4884 阅读 284691评论 41喜欢 618赞赏 2 关于消息队列,从前年开始断断续续看了些资料, ...

  2. Docker —— 使用 Dockerfile 制作 Jdk + Tomcat 镜像

    一.准备好Jdk和Tomcat apache-tomcat-8.5.50.tar.gz jdk-8u212-linux-x64.tar.gz 注意: Jdk 和 Tomcat 记得从官网下载,否则制作 ...

  3. 025.Python面向对象以及对对象的操作

    一 面向对象基本概念 1.1 OOP面向对象的程序开发 用几大特征表达一类事物称为一个类,类更像是一张图纸,表达只是一个抽象概念 对象是类的具体实现,更像是由这图纸产出的具体物品,类只有一个,但是对象 ...

  4. Apache Flink 1.12.0 正式发布,DataSet API 将被弃用,真正的流批一体

    Apache Flink 1.12.0 正式发布 Apache Flink 社区很荣幸地宣布 Flink 1.12.0 版本正式发布!近 300 位贡献者参与了 Flink 1.12.0 的开发,提交 ...

  5. 关于Unity启动调用Android_id问题排查

    问题:Unity启动时获取了设备信息,其中包括Android_id 以下是在androidstudio中的log,使用Xposed的LoginHook看到Unity启动时获取了android_id信息 ...

  6. 『动善时』JMeter基础 — 31、JMeter中BeanShell断言详解

    目录 1.BeanShell简介 2.Beanshell的内置变量和方法 3.BeanShell断言界面详解 4.BeanShell断言的使用 (1)测试计划内包含的元件 (2)登陆接口请求界面内容 ...

  7. 缩放 transform

    转换属性 transform 转换是css3中的一个特征,可以实现元素的缩放,位移,变形. 作用: 使元素在位置或者形状上发生一定的改变. 属性: transform 属性值: scale:缩放(一般 ...

  8. celery 简单示例

    目录结构 第一步  celery_task 里面的celery文件 import time from celery import Celery # celery from celery.schedul ...

  9. Symbol类型的应用

    应用场景1:使用Symbol来作为对象属性名(key) 在这之前,我们通常定义或访问对象的属性时都是使用字符串,比如下面的代码: let obj = { abc: 123, "hello&q ...

  10. 摄像头Camera 标定Calibration原理Theory

    摄像头Camera 标定Calibration原理Theory cv2.cameraCalibration Pinhole camera calibration calls camera vision ...