一、模板语言介绍

模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数

二、模板语言的语法

模板中也有自己的语言,该语言可以实现数据展示

# 业务请求处理做的页面渲染
return render("request", "template.html", {"k1": "v1", "k2": [11, 22, 33], "k3": {"nid": 12, "name": "aaa"}) # html页面模板语法
{{ k1 }}
{{ k2.0 }} # 取列表中的第一个值,通过.获取
{{ k3.name }} # 取字典中对应key的值 # for循环
{% for item in k2 %}
<p>
{{ item }},
{{ forloop.counter }}, # 索引,从1开始,类似于python中的enumerate,
{{ forloop.counter0 }}, # 索引,从0开始,类似于python中的enumerate,
{{ forloop.first }}, # 判断当前item是否是第一个元素,成立为True,不成立为False
{{ forloop.last }}, # 判断当前item是否是最后一个元素,成立为True,不成立为False
{{ forloop.revcounter }} # 倒序索引,与forloop.counter 相反
</p>
{% endfor %} # if条件判断
{% if k1 == "v1" %}
<h1>V1</h1>
{% elif k2 == "v2" %}
<h1>V2</h1>
{% else %}
<h1>666</h1>
{% endif %}

三、 内置方法,类似于python的内置函数

{{ k1|lower }}  # 将所有字母都变为小写
{{ k1|first|upper }} # 将首字母变为大写
{{ k1|truncatewords:"30" }} # 取变量k1的前30个字符
{{ item.createTime|date:"Y-m-d H:i:s" }} # 将时间转为对应格式显示

四、自定义方法

在内置的方法满足不了我们的需求的时候,就需要自己定义属于自己的方法了,自定义方法分别分为filter和simple_tag

1、区别:

```
① 传参:
filter默认最多只支持2个参数:可以用{{ k1|f1:"s1, s2, s3" }}这种形式将参数传递个函数,由函数去split拆分
simple_tag支持多个参数:{% f1 s1 s2 s3 s4 %} 有多少就写多少 ② 模板语言if条件:
filter:
{% if k1|f1 %} # 函数的结果作为if语句的条件
<h1>True</h1>
{% else %}
<h1>False</h1>
simple_tag: 不支持模板语言if条件
```

2、自定义方法使用流程:

  • a、在app中创建templatetags目录,目录名必须为templatetags
  • b、在目录templatetags中创建一个.py文件,例如 s1.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author:zhangcong
# Email:zc_92@sina.com from django import template register = template.Library() # 这一句必须这样写 @register.filter
def f1(value):
return value + "666" @register.filter
def f2(value, arg):
return value + "666" + arg @register.simple_tag
def f3(value, s1, s2, s3, s4):
return value + "666" + s1 + s2 + s3 + s4
  • c、html模板顶部通过{% load s1 %}导入py文件
{% load s1 %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body> <h1>{{ title }}</h1> {# 使用filter方式调用自定义方法 #}
<!-- 将k1当做参数传递给f1函数进行处理 处理方式 f1(k1) -->
<p>{{ k1|f1 }}</p>
<!-- 将k1当做参数传递给f2函数进行处理,接受2个参数 处理方式 f2(k1, "xxx") -->
<p>{{ k1|f2:"xxx" }}</p> {# 使用simple_tag方式调用自定义方法 #}
<!-- 将k1当做参数传递给f3函数进行处理,接收多个参数 处理方式 f3(k1, "s1", "s2", "s3", "s4") -->
<p>{% f3 k1 "s1" "s2" "s3" "s4" %}</p>
</body>
</html>
  • d、settings.py中注册app

五、母版

在一个网站中,一些页面中的顶部,左侧,底部都是一样的,这个时候就出现了代码的冗余,这个时候就可以将这些重复使用的代码做成母版,方便在子页面中进行调用,下面是使用母版的一个例子中用到的一些文件,以及使用母版的效果图

1、路由文件 urls.py

from django.conf.urls import url, include
from cmdb import views urlpatterns = [ url(r'^userinfo/', views.userinfo), # 用户管理
url(r'^assets/', views.assets), # 资产管理
]

2、业务请求处理文件 views.py

from django.shortcuts import render
from django.shortcuts import HttpResponse def userinfo(request):
# 用户信息
userinfo_list = []
for i in range(10):
userinfo_list.append({"name": "name%s" % i, "email": "email%s@xxx.com"}) return render(request, "userinfo.html", {"userinfo_list": userinfo_list}) def assets(request):
# 资产信息
assets_list = []
for i in range(10):
assets_list.append({"hostname": "host%s" % i, "port": 80}) return render(request, "assets.html", {"assets_list": assets_list})

3、母版html文件 extend.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.pg-header{ height: 48px;
background-color: cadetblue;
} .pg-body{
min-height: 500px;
}
.pg-body .body-menu{
width: 20%;
float: left;
}
.pg-body .body-content{
width: 80%;
float: left;
} .pg-footer{
height: 100px;
background-color: brown; }
</style>
{% block css %}{% endblock %} <!-- 使用blok来空出子页面需要填充的css样式内容 -->
</head>
<body> <div class="pg-header"></div>
<div class="pg-body"> <div class="body-menu">
<ul>
<li><a href="/userinfo/">用户管理</a></li>
<li><a href="/assets/">资产管理</a></li>
</ul> </div>
<div class="body-content">
{% block body-content %}{% endblock %} <!-- 使用blok来空出子页面需要填充的内容 -->
</div> </div>
<div class="pg-footer"></div> {% block js %}{% endblock %} <!-- 使用blok来空出子页面需要填充的js内容 -->
</body>
</html>

4、用户管理html文件 userinfo.html

{% extends 'extend.html' %}    # 继承母版内容

<!-- 填充页面css样式内容 -->
{% block css %}
<!-- css样式 -->
{% endblock %} <!-- 填充页面内容 -->
{% block body-content %} <table> <thead>
<tr>
<td>用户名</td>
<td>邮箱</td>
</tr>
</thead>
<tbody>
{% for item in userinfo_list %}
<tr>
<td>{{ item.name }}</td>
<td>{{ item.email }}</td>
</tr>
{% endfor %} </tbody>
</table> {% endblock %} <!-- 填充页面js代码内容 -->
{% block js %}
<!-- js代码 -->
{% endblock %}

5、资产管理html文件 assets.html

{% extends 'extend.html' %}     # 继承母版内容

<!-- 填充页面css样式内容 -->
{% block css %}
<!-- css样式 -->
{% endblock %} <!-- 填充页面内容 -->
{% block body-content %} <table> <thead>
<tr>
<td>主机名</td>
<td>端口</td>
</tr>
</thead>
<tbody>
{% for item in assets_list %}
<tr>
<td>{{ item.hostname }}</td>
<td>{{ item.port }}</td>
</tr>
{% endfor %} </tbody>
</table> {% endblock %} <!-- 填充页面js代码内容 -->
{% block js %}
<!-- js代码 -->
{% endblock %}

6、请求用户管理页面展示效果 http://127.0.0.1:8000/userinfo/

7、请求资产管理页面展示效果 http://127.0.0.1:8000/assets/

Django之模板语言的更多相关文章

  1. Django的模板语言

      Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. ...

  2. django 更新 模板语言

    Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{  }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...

  3. Django之模板语言(一)

    1.Django的模板语言(简而言之,字符串替换) 1.目前为止已经学过的模板语言: 1.{{ name }}  ------>变量 2. for 循环: {% for i in book_li ...

  4. 第四篇Django之模板语言

    Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...

  5. django的模板语言中一些之前没有用过的小点

    1.模板语言中的for循环的最后一个的表示方式 {% for auther in auther_list %} {% if forloop.last %} {# 这里的意思是for循环的最后一个的意思 ...

  6. Django的模板语言介绍

    模板语言: 1.我们先看下在命令行中渲染模板 先导入模块对象 2.渲染一个变量 <p>当前时间:{{ time }}</p> return render(request,&qu ...

  7. django 中模板语言的各种用法

    模板 1.视图中使用模板 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户 1.普通方法:HTML被直接硬编码在 P ...

  8. Django之模板语言(四) ------>Tags

    案例1:单层for循环 # Django 模板语言测试代码 def template_test(request): name_list=["张三","李四",& ...

  9. Django之模板语言(三)------>自定义filter

    1.自定义filter: 1.在app01下面新建一个templatetags的python package包. 如果没有app01的话,可以通过命令行在manage中进行创建:python mana ...

随机推荐

  1. LVM命令摘要

      命令 描述 物理卷(PV) pvcreate 创建LVM磁盘     #pvcreate /dev/sdb pvdisplay 显示卷组中的物理卷信息 pvchange 设置PV的性能,允许或拒绝 ...

  2. Linux学习计划

    用Linux已经有很长一段时间了,先后用过Debian和CentOS,但一直没有系统地去学习,现在一是有时间,二是工作中需要用到,所以准备用心去学习一下. 一.教材 1.主要以<鸟哥Linux& ...

  3. bzoj 3043 (差分序列运用)

    维护差分序列 显然要使差分序列的后n-1位为0 对于原来的区间操作 只需要单点修改或者两个点修改 就转化成了 对于差分序列但以一个数+ 或 - 或者一个+1同时一个- ans1=max(sum1,su ...

  4. ref传参时出错

    下面是一段正确的代码: //基类A public class A { public void SomeMethod(A a) { } } //派生类B public class B:A { } //在 ...

  5. N!水题

    //题目是求N!的问题,思路:设定一个整形数组来存放每次计算过后的值 有两个for循环,第一个for循环每次加进一个数 然后在第二个for循环里面计算出此时的阶乘,比如9999,先给出i=2 在第二个 ...

  6. ImageIO.wtrie生成jpg图片质量损失方案:BufferedImage生成jpg图片文件流

    Iterator<ImageWriter> iterator = ImageIO.getImageWritersByFormatName("jpeg"); ImageW ...

  7. HTML5触摸屏touch事件使用实例1

    1.源码: <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> ...

  8. .net 文件下载方法

    public void DownLoadMethod(string FilePath)        {            string hzm = Path.GetExtension(FileP ...

  9. 启发式算法、寻路算法A*算法

    原文链接: http://blog.csdn.net/b2b160/article/details/4057781

  10. POJ2955:Brackets(区间DP)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...