Django中级篇之模板语言
Posted 叶祖辉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django中级篇之模板语言相关的知识,希望对你有一定的参考价值。
模板
一、引用变量
模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户。
{{ xxx }}
二、标签
用{% %}表示,用于处理一些逻辑
常用的几个标签 {% if 条件 %} 内容 {% endif %} {% for xxx in 条件 %} {{xxx}} {% endfor %}
1、for标签
1>每一次循环中,模板系统会渲染在 {% for %} 和 {% endfor %} 之间的所有内容
2> 给标签增加一个 reversed 使得该列表被反向迭代
{% for athlete in athlete_list reversed %}
3>可以嵌套使用 {% for %} 标签
4> Django不支持退出循环操作。 如果我们想退出循环,可以改变正在迭代的变量,让其仅仅包含需要迭代的项目。 同理,Django也不支持continue语句,我们无法让当前迭代操作跳回到循环头部。
5>在每个`` {% for %}``循环里有一个称为`` forloop`` 的模板变量。这个变量有一些提示循环进度信息的属性。
富有魔力的forloop变量只能在循环中得到,当模板解析器到达{% endfor %}时forloop就消失了
forloop.counter 总是一个表示当前循环的执行次数的整数计数器 forloop.counter0 类似于forloop.counter ,但是它是从0计数的 forloop.first是一个布尔值;在第一次执行循环时被置为True forloop.last 是一个布尔值;在最后一次执行循环时被置为True
2、if标签
1>{% if %}标签计算一个变量值,如果是“true”,即它存在、不为空并且不是false的boolean值 系统则会显示{% if %}和{% endif %}间的所有内容
2>没有{% elif %}标签,使用嵌套的{% if %}标签可以做到同样的事情
3>{% if %}标签接受and,or或者not来测试多个变量值或者否定一个给定的变量
4>{% if %}标签不允许同一标签里同时出现and和or,否则逻辑容易产生歧义
5>如果你想结合and和or来做高级逻辑,只需使用嵌套的{% if %}标签即可
6>多次使用同一个逻辑符号是合法的
三、模板继承
模板可以用继承的方式来实现复用。在整个网站中,减少共用页面区域(比如站点导航)所引起的重复和冗余代码
本质上来说,模板继承就是先构造一个基础框架模板,而后在其子模板中对它所包含站点公用部分和定义块进行重载,第一步是定义 基础模板 , 该框架之后将由子模板所继承
母版:
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>{% block title %}久久寻网{% endblock %}</title> <link type="text/css" rel="stylesheet" href="style.css" /> </head> <body> <div id="side"> {% block side %} <ul> <li><a href="/index.html">主页</a></li> <li><a href="/blog/index.html">博客</a></li> </ul> {% endblock %} </div> <div id="content"> {% block content %}{% endblock %} </div> </body> </html>
我们称它为 base.html, 定义了一些简单的 HTML 骨架文档, 你可以把它用到一些简单两列的网页上. “子” 模板的任务就是用内容填写这些空白的内容块
子版:
{% extends "text.html" %} {% block title %}修改标题{% endblock %} {% block side %} <ul> <li><a href="/index.html">修改后主页</a></li> <li><a href="/blog/index.html">修改后博客</a></li> </ul> {% endblock %} {% block content %} <h1>新增加内容</h1> {% endblock %}
1>{% extends "text.html" %}表示导入母版
2> 每个{% block %}标签所要做的是告诉模板引擎,该模板下的这一块内容将有可能被子模板覆盖,而不一定一定要覆盖掉母版中的内容
四、注释标签
1. Django单行注释使用 {# 这是一个注释 #}
用这种语法的注释不能跨越多行, 这个限制是为了提高模板解析的性能。 在下面这个模板中,输出结果和模板本身是 完全一样的(也就是说,注释标签并没有被解析为注释):
This is a {# this is not a comment #} test.
2. 实现多行注释,可以使用`` {% comment %}`` 模板标签
{% comment %} This is a multi-line comment. {% endcomment %}
五、过滤器
1>模板过滤器可以在变量被显示前修改它,过滤器使用管道字符,如下所示:
{{ name|lower }}
2>过滤管道可以被* 套接* ,既是说,一个过滤器管道的输出又可以作为下一个管道的输入:
{{ my_list|first|upper }}
六、ifequal/ifnotequal 标签
1. {% ifequal %} 标签比较两个值,当他们相等时,显示在 {% ifequal %} 和 {% endifequal %} 之中所有的值下面的例子比较两个模板变量 user 和 currentuser :
{% ifequal user currentuser %} <h1>Welcome!</h1> {% endifequal %}
自定义simple_tag
a、在app中创建templatetags模块
b、创建任意 .py 文件,如:xx.py
c、在使用自定义simple_tag的html文件中导入之前创建的 xx.py 文件名
{% load xx %}
d、使用simple_tag
{% my_simple_time 1 2 3%} {% my_input ‘id_username‘ ‘hide‘%}
e、在settings中配置当前app,不然django无法找到自定义的simple_tag
以上是关于Django中级篇之模板语言的主要内容,如果未能解决你的问题,请参考以下文章
[AngularJS] AngularJS系列 中级篇之指令
Python+Selenium中级篇之2-Python中类/函数/模块的简单介绍和方法调用
Python+Selenium中级篇之8-Python中的继承的使用