热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

小白必看!Django模板语言基础来啦

作者|单雨责编|胡巍巍出品|CSDN(ID:CSDNnews)前言为了实现模板封装和复用,提高HTML界面调试便捷性以及

640?wx_fmt=gif

640?wx_fmt=jpeg

作者 | 单雨

责编 | 胡巍巍

出品 | CSDN(ID:CSDNnews)

 

640?wx_fmt=png

前言

 

为了实现模板封装和复用,提高HTML界面调试便捷性以及前后端解耦等目标,Django定义了自己的网络模板语言。

当前介绍模板语言的官方文档已经非常完备,几乎涵盖了开发中需要用到的知识点和需要注意的问题,但同时官方文档也存在一些问题:


  • 翻译不够完善,带来阅读的困难;

  • 一些知识点的介绍过于简短,存在大量的页内链接,阅读时需要跳转到不同的页面,阅读不连贯。

本文基于官方文档系统介绍了Django模板语言的基础知识点,方便快速了解Django模板语言。

 

640?wx_fmt=png

模板系统设计哲学

 

Django的模板系统不是简单的把Python嵌入到HTML中。 

它的设计宗旨是:模板系统旨在展示内容, 而不是程序逻辑,因此不在HTML页面中嵌入Python。

简单的说,模板只负责渲染数据,大多数逻辑应该交给视图(view)进行处理。

 

640?wx_fmt=png

模板简介

 

模板是一个简单的文本文件。它可以生成任何基于文本的格式(如 HTML,XML,CSV等)。除了基本的HTML标签外,模板还包含两种额外的元素——变量和标签。

模板中包含的变量可以被替换为变量的值,标签则被替换为相应的模板控制逻辑。示例:

django

{% extends "base_generic.html" %}



{% block title %}{{ section.title }}{% endblock %}



{% block content %}

{{ section.title }}





{% for story in story_list %}



  

    {{ story.headline|upper }}

  



{{ story.tease|truncatewords:"100" }}



{% endfor %}

{% endblock %}

`{{ section.title }}`在模板渲染时将会被变量的值替换,for标签可以实现模板的循环渲染。

 

640?wx_fmt=png

基础语法

 

变量

变量实现从模板上下文字典(返回HTTP响应时传递过来的字典)中输出一个值,这是一个类似于dict的对象,包含键值对。当模板引擎遇到一个变量时,它会计算该变量,并用结果替换它。

变量名由字母、数字字符和下划线("_")组成,但不能以下划线开头。点(".")也出现在变量中,代表属性调用,变量名中不能有空格或标点符号。

示例:

django

My first name is {{ first_name }}. My last name is {{ last_name }}.

当传入一个上下文字典`{'first_name': 'John', 'last_name': 'Doe'}`时,将会渲染得到:

django

My first name is John. My last name is Doe.

模板中的变量被字典中的值替换了。

变量还可以使用点表示法实现字典查找、属性查找和列表索引查找等操作:

django

{{ my_dict.key }}

{{ my_object.attribute }}

{{ my_list.0 }}

点表示法底层原理

当模板系统遇到一个点,它会按顺序尝试下面的动作:

1. 字典查询

2. 属性或方法查找

3. 数字索引查询

如果结果值是可调用的,则调用该值时将不带参数,调用的结果成为新的模板值。

当进行能覆盖字典查找的操作时,这种查找顺序可能会造成一些意想不到的行为。例如:如果试图循环一个collection .defaultdict字典对象:

 

django

{% for k, v in defaultdict.items %}

    {其他操作}

{% endfor %}

因为字典查找是首先发生的,所以这个行为会先提供一个默认值,而不是使用预期的.items()方法。在这种情况下,应该首先考虑使用字典查找,而不是使用字典的属性调用。

注意

属性通常被解释为一个文本字符串,防止和同名的变量冲突。例如{{foo.bar}}中的属性“bar”将被解释为一个文本字符串,如果模板上下文中存在变量“bar”,则不会使用该变量的值。

以下划线开头的变量属性可能不能访问,因为它们通常被认为是私有的。

如果引用不存在的变量,模板系统将插入string_if_invalid选项的值,该选项默认设置为“”(空字符串)。

标签

标签在模板渲染过程中提供任意逻辑。标签可以输出内容,作为控制结构,例如“if”语句或“for”循环,从数据库获取内容,甚至允许访问其他模板标签。

(1)标签声明

标签的一般形式为:

 

django

{% tag %}

示例:

django

{% csrf_token %}

(2)传入参数

django

{% cycle 'odd' 'even' %}

(3)成对使用的标签

有些标签需要开始和结束标签:

django

{% if user.is_authenticated %}Hello, {{ user.username }}.{% endif %}

(4)常用标签

for:循环数组中的每个元素.  比如, 显示列表 `athlete_list` 中每个元素的 `name` 属性。

django

  



      {% for athlete in athlete_list %}

          
  • {{ athlete.name }}


  •   {% endfor %}

      

if 、elif和else:在上面,如果athlete_list不为空,则{{athlete_list|length}}变量将显示运动员的数量。

否则,如果athlete_in_locker_room_list不为空,则会显示“Athletes should be out…”消息。如果两个列表都为空,则显示“No athletes”。

也可以在if标签里使用过滤器和各种操作符:

django

  {% if athlete_list|length > 1 %}

     Team: {% for athlete in athlete_list %} ... {% endfor %}

  {% else %}

     Athlete: {{ athlete_list.0.name }}

  {% endif %}

注意

虽然上面的示例可以工作,但是要注意,大多数模板过滤器都返回字符串,因此使用过滤器进行数学比较通常不会正常工作,而长度是个例外。

(5)更多

Django有很多内置标签,更多关于内置标签的信息请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-tags

如果需要编写自定义标签,请参考官方文档

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/howto-writing-custom-template-tags

如果需要对使用的标签和自定义的标签做一份说明文档,可以使用Django提供的文档工具,详情请参考:

https://docs.djangoproject.com/zh-hans/2.2/ref/contrib/admin/admindocs/

 

640?wx_fmt=png

过滤器

 

简介

过滤器可以对变量做一些操作,例如给变量赋值,改变变量的值等。

修改变量显示

过滤器可以修改变量的显示。例如:

django

 {{ name|lower }} 

通过过滤器lower变量{{ name }}变为了小写字符,通过管道符(|)间隔变量和过滤器来使用过滤器。

链式调用过滤器

一个过滤器的输出可以作为下一个过滤器的输入。

 {{ text|escape|linebreaks }}是一种常用的转换方式, 在这之后换行符被替换为了

标签。

转换变量和标签参数

过滤器转换变量和标签参数的值。示例:

django

{{ django|title }}

传入`{'django': 'the web framework for perfecalist With deadline '}`上下文字典时,该模板呈现为:

django

The Web Framework For Perfectionists With Deadlines

传入参数给过滤器

示例1:

django

{{ my_date|date:"Y-m-d" }}

my_date将会被替换为当前日期。

示例2:

django 

{{ bio|truncatewords:30 }}

将会会显示 `bio` 变量的前30个字符

注意

过滤器参数中如果包含空格和标点符号,必须使用引号“”括起来,例如,要用逗号和空格连接列表,可以使用{{list|join:", "}}。

Django提供了大约60个内置模板过滤器,请参考官方文档:

https://docs.djangoproject.com/zh-hans/2.2/ref/templates/builtins/ref-templates-builtins-filters,

下面列举一些常用的过滤器:

default

如果变量为false或空,则使用给定的默认值。否则,使用变量的值。例如:

django

  {{ value|default:"nothing" }}

如果 `value` 没有提供或者为空,那么将它显示为 "`nothing`" 。

length

返回值的长度。这对字符串和列表都适用。例如:

django

  {{ value|length }}

如果 `value` 为 `['a', 'b', 'c', 'd']`, 那么他将被显示为 `4`。

filesizeformat

将值格式化为“人类可读的”文件大小(即“13kb”、“4.1 MB”、“102字节”等)。例如:

django

  {{ value|filesizeformat }}

如果值为123456789,则输出为117.7 MB。

如果需要自定义过滤器,请参考请官方文档:

https://docs.djangoproject.com/zh-hans/2.2/howto/custom-template-tags/

 

640?wx_fmt=png

注释

 

示例:

单行注释

django

{ this won't be rendered }

多行注释:{% comment %} 和{% endcomment %}

django

Rendered text with {{ pub_date|date:"c" }}



{% comment "Optional note" %}

    

Commented out text with {{ create_date|date:"c" }}



{% endcomment %}

注意:Comment标签不能嵌套使用。

作者简介:单雨,90后工科男,伪文艺青年。目前就读于北京理工大学宇航系,喜欢研究AI,网络爬虫,微信小程序以及机器人,痴迷于Coding,睡前必撸码。

【END】


Python 学习路线思维导图, 收藏!

https://edu.csdn.net/topic/python115?utm_source=csdn_bw


640?wx_fmt=jpeg

 热 文 推 荐 

☞D

640?wx_fmt=gif点击阅读原文,即刻阅读《程序员大本营》最新期刊。

640?wx_fmt=png

你点的每个“在看”,我都认真当成了喜欢640?wx_fmt=png


推荐阅读
  • 本文介绍了Hive常用命令及其用途,包括列出数据表、显示表字段信息、进入数据库、执行select操作、导出数据到csv文件等。同时还涉及了在AndroidManifest.xml中获取meta-data的value值的方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了Android中的assets目录和raw目录的共同点和区别,包括获取资源的方法、目录结构的限制以及列出资源的能力。同时,还解释了raw目录中资源文件生成的ID,并说明了这些目录的使用方法。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 前言:拿到一个案例,去分析:它该是做分类还是做回归,哪部分该做分类,哪部分该做回归,哪部分该做优化,它们的目标值分别是什么。再挑影响因素,哪些和分类有关的影响因素,哪些和回归有关的 ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
author-avatar
xiaodubo1R
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有