第四篇Django之模板语言
Django之模板语言
一 模板的执行
模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户
def current_datetime(request):
now = datetime.datetime.now()
html = "<html><body>It is now %s.</body></html>" % now
return HttpResponse(html)
直接放在views里
二 模板语言
2.1 变量
只需要记两种特殊符号
{{ }} 变量相关 {% %} 逻辑相关
示例一:显示一个基本的字符串在网页上
views.py
def text_str(resquest):
str = '我在学习Django'
return render(resquest, 'home.html', {'str': str})
home.html
{{ str }}
2.2 Django模板中的for循环标签
示例二(1):基本的for循环和list的内容
views.py
def text_list(resquest):
list=['HTML','CSS','jquery','MySQL','python','Django']
return render(resquest, 'home.html', {'list': list})
home.html
{{ list }} 得到一个列表
=================================================
{% for i in list %}
{{ i }} 得到具体的值
{% endfor %}
示例二(2):dict的内容
views.py
def text_dic(resquest):
dic={1:'HTML',2:'CSS'}
return render(resquest, 'home.html', {'dic':dic})
home.html
{{ dic.1 }} ---------- dic.key
在模板中取字典的键用点 dic.1 而不是Python中的 dic['1']
还可以这样遍历字典:
{% for key,value in dic.items %}
{{ key }}:{{ value }}
{% endfor %}
其实就是在遍历这样一个list:[(1,'HTML')(2,'CSS')]
示例三 在模板进行 条件判断和for循环的详细操作
views.py
def text_for(request):
List = map(str, range(100))# 一个长度为100的 List
return render(request, 'home.html', {'List': List})
home.html
不加任何符号
{% for item in List %}
{{ item }}
{% endfor %}
结果
加一个逗号
{% for item in List %}
{{ item }},
{% endfor %}
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,
结果
我们会发现最后一个元素后面也有一个逗号,这样肯定不爽,如何判断是不是遍历到了最后一个元素了呢?
用变量 forloop.last 这个变量,如果是最后一项其为真,否则为假,更改如下:
{% for item in List %}
{{ item }}{% if not forloop.last %},{% endif %}
{% endfor %}
| Variable | Description |
| forloop.counter | 当前循环的索引值(从1开始) |
| forloop.counter0 | 当前循环的索引值(从0开始) |
| forloop.revcounter | 当前循环的倒序索引值(从1开始) |
| forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
| forloop.first | 当前循环是不是第一次循环(布尔值) |
| forloop.last | 当前循环是不是最后一次循环(布尔值) |
| forloop.parentloop | 本层循环的外层循环 |
示例四 (1) 当列表中可能为空时用 for ...empty
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% empty %}
<li>抱歉,列表为空</li>
{% endfor %}
</ul>
(2) if,elif 和 else
{% if user_list %}
用户人数:{{ user_list|length }}
{% elif black_list %}
黑名单数:{{ black_list|length }}
{% else %}
没有用户
{% endif %}
(3)当然也可以只有if和else
{% if user_list|length > 5 %}
七座豪华SUV
{% else %}
黄包车
{% endif %}
2.3 Django模板中的条件判断标签
示例五 if语句支持==、>、<、!=、<=、>=判断
{% if var >= 90 %}
成绩优秀
{% elif var >= 80 %}
成绩良好
{% elif var >= 70 %}
成绩一般
{% elif var >= 60 %}
需要努力
{% else %}
不及格啊,大哥!多学习啊!
{% endif %}
(注意:比较符号前后必须有至少一个空格!)
and, or, not, in, not in 也可以在模板中使用
假如我们判断 num 是不是在 0 到 100 之间:
{% if num <= 100 and num >= 0 %}
num在0到100之间
{% else %}
数值不在范围之内!
{% endif %}
我们判断‘某某’在你不在一个列表中
{% if '某某' in List %}
某某在名单中
{% endif %}
示例六 模板上得到视图对应的网址
# views.py
def add(request, a, b):
c = int(a) + int(b)
return HttpResponse(str(c)) # urls.py
urlpatterns = patterns('',
url(r'^add/(\d+)/(\d+)/$', 'app.views.add', name='add'),
) # template html
{% url 'add' 4 5 %}
这样网址上就会显示出:/add/4/5/ 这个网址,假如我们以后修改 urls.py 中的
r'^add/(\d+)/(\d+)/$'
这一部分,改成别的,比如
r'^jiafa/(\d+)/(\d+)/$'
这样,我们不需要再次修改模板,当再次访问的时候,网址会自动变成 /jiafa/4/5/
示例七 取别名
两种方法
①
{% url 'some-url-name' arg arg2 as the_url %}
<a href="{{ the_url }}">链接到:{{ the_url }}</a>
②
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
实例八,模板中 获取当前网址,当前用户等:
8.1 获取当前用户
{{ request.user }}
如果登陆就显示内容,不登陆就不显示内容
{% if request.user.is_authenticated %}
{{ request.user.username }},您好!
{% else %}
请登陆,这里放登陆链接
{% endif %}
8.2.1 获取当前网址
{{ request.path }}
8.2.2 获取当前 GET 参数
{{ request.GET.urlencode }}
8.2.3 合并到一起用的一个例子
<a href="{{ request.path }}?{{ request.GET.urlencode }}&delete=1">当前网址加参数 delete</a>
比如我们可以判断 delete 参数是不是 1 来删除当前的页面内容
2.4 Django模板中的过滤器(Filters)的使用
语法:
{{ name|lower }}
示例
views.py
def home(request):
name = ['HTML','CSS','jquery','MySQL','python','Django']
return render(request, 'home.html', {'name': name})
home.html
{{ name|lower}}
=========================
其他用法
1 default
语法:
{{ value:default: "nothing"}}
views.py
def home(request):
name2 = []
return render(request, 'home.html', {'name': name})
home.html
{{ name:default: "nothing"}}
2 length
语法:
{{ value|length }}
views.py
def home(request):
name = ['HTML','CSS','jquery','MySQL','python','Django']
return render(request, 'home.html', {'name': name})
home.py
{{ name|length }}
'|'左右没有空格没有空格没有空格
3 filesizeformat
将值格式化成为一个‘人类可读的’文件尺寸(例如‘13KB’,'4,1MB',等待)
语法:
{{ value|filesizeformat }}
views.py
def home(request):
name = 123456789
return render(request, 'home.html', {'name': name})
home.py
{{ name|filesizeformat }}
4 slice切片
语法:
{{value|slice:"2:-1"}}
views.py
def home(request):
name = ['HTML','CSS','jquery','MySQL','python','Django']
return render(request, 'home.html', {'name': name})
home.py
{{ name|slice:'0:4' }}
5 data
语法:
{{ value|date:"Y-m-d H:i:s"}}
views.py
import datetime
def home(request):
name = datetime.datetime.now()
return render(request, 'home.html', {'name': name})
home.py
{{ name|date:'Y-m-d' }}
6 safe
Django的模板中会对HTML标签和JS等语法标签进行自动转义,原因显而易见,这样是为了安全。但是有的时候我们可能不希望这些HTML元素被转义,比如我们做一个内容管理系统,后台添加的文章中是经过修饰的,这些修饰可能是通过一个类似于FCKeditor编辑加注了HTML修饰符的文本,如果自动转义的话显示的就是保护HTML标签的源文件。为了在Django中关闭HTML的自动转义有两种方式,如果是一个单独的变量我们可以通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义
语法:
{{ value|safe}}
views.py
def home(request):
value = "<a href='https://www.baidu.com/'>点我</a>"
return render(request, 'home.html', {'value': value})
home.py
{{ value|safe}}
7 truncatechars
如果字符串字符多于指定的字符数量,那么会被截断。截断的字符串将以可翻译的省略号序列(“...”)结尾。
参数:截断的字符数
语法:
{{ value|truncatechars:9}}
views.py
def home(request):
value = "2018年3月28日外交部发言人"
return render(request, 'home.html', {'value': value})
home.py
{{ value|truncatechars:9}}
8 自定义fllter
① 在app中创建templatetags 文件夹 (必须的)
②创建任意的 .py 文件,如:my_tags.py
from django import template
register = template.Library() #register的名字是固定的,不可改变
@register.filter()
def filter_multi(v1,v2):
return v1 * v2
③在使用自定义simple_tag和filter的html文件中导入之前创建的 my_tags.py :{% load my_tags %}
④views.py里
def home(request):
num=12
return render(request, 'home.html', {'num': num})
⑤ 使用simple_tag和filter(如何调用)
-------------------------------.html
{% load xxx %} #首行
# num=12
{{ num|filter_multi:2 }} #24
⑥
在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag.
注意:
filter可以用在if等语句后,simple_tag不可以
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
===simple_tag===
my_tags.py
from django import template
register = template.Library() @register.simple_tag()
def simple_tag_multi(v1,v2,v3):
return v1*v2*v3
views.py
def home(request):
return render(request, 'home.html')
home.html
{% load my_tags %}
{% simple_tag_multi 2 5 2%}
9 csrf_token
这个标签用于跨站请求伪造保护。
在页面的form表单里面写上{% csrf_token %}
例子:钓鱼网站
10 注释
{# ... #}
三 母板
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Title</title>
{% block page-css %} {% endblock %}
</head>
<body> <h1>这是母板的标题</h1> {% block page-main %} {% endblock %}
<h1>母板底部内容</h1>
{% block page-js %} {% endblock %}
</body>
</html>
注意:我们通常会在母板中定义页面专用的CSS块和JS块,方便子页面替换。
继承母板
在子页面中在页面最上方使用下面的语法来继承母板
{% extends 'layouts.html' %}
块
通过在母版中使用 {%block xxx%} 来定义‘块’
在子夜中通过定义母版中的block名来对应替换母版中相应的内容
母版html里
{% block page-main %}
{% endblock %}
对应的html
{% block page-main %}
<p>世情薄</p>
<p>人情恶</p>
<p>雨送黄昏花易落</p>
{% endblock %}
组件
可以将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可
{% include 'navbar.html' %}
配置css/js 文件时
母版html
{% block page-css %}{% endblock %}
---------------------------------------------------------------
{% block page-js %}{% endblock %}
相应的html
{% block page-css %}
<link href="/static/css/dashboard.css" rel="stylesheet">
{% endblock %}
------------------------------------------------------------
{% block page-js %}
<script src="/static/jquery-3.2.1.min.js"></script>
{% endblock %}
静态文件相关
导入文件
{% load static %}
<img src="{% static "img/img/sms.ivo" %}">
导入JS文件使用
{% load static %}
<script src="{% static "mytest.js" %}"></script>
某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
另一种方法get_static_prefix
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
inclusion_tag
示例
templatetags/my_inclusion.py
from django import template
register = template.Library() @register.inclusion_tag('result.html')
def show_results(n):
# 三元运算
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)].....//[第1项,第2项]
return {"data": data}
templates/snippets/result.html
<ul>
{% for i in data %}
<li>{{ i }}</li>
{% endfor %}
</ul>
templates/index.html
{% load inclusion_tag_test %}
{% show_results 10 %}
第四篇Django之模板语言的更多相关文章
- 第四篇flask中模板语言 jinja2
Flask中默认的模板语言是Jinja2 首先我们要在后端定义几个字符串,用于传递到前端 STUDENT = {, 'gender': '中'}, STUDENT_LIST = [ {, 'gende ...
- Django的模板语言
Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 {{ 变量名 }} 变量名由字母数字和下划线组成. ...
- django 更新 模板语言
Django模板系统 官方文档 常用语法 只需要记两种特殊符号: {{ }}和 {% %} 变量相关的用{{}},逻辑相关的用{%%}. 变量 在Django的模板语言中按此语法使用:{{ 变量名 ...
- Django之模板语言(一)
1.Django的模板语言(简而言之,字符串替换) 1.目前为止已经学过的模板语言: 1.{{ name }} ------>变量 2. for 循环: {% for i in book_li ...
- Django之模板语言(四) ------>Tags
案例1:单层for循环 # Django 模板语言测试代码 def template_test(request): name_list=["张三","李四",& ...
- Django之模板语言
一.模板语言介绍 模板语言渲染的整个过程其实就是将html转换成函数,并为该函数提供全局变量,然后执行该函数 二.模板语言的语法 模板中也有自己的语言,该语言可以实现数据展示 # 业务请求处理做的页面 ...
- django的模板语言中一些之前没有用过的小点
1.模板语言中的for循环的最后一个的表示方式 {% for auther in auther_list %} {% if forloop.last %} {# 这里的意思是for循环的最后一个的意思 ...
- Django的模板语言介绍
模板语言: 1.我们先看下在命令行中渲染模板 先导入模块对象 2.渲染一个变量 <p>当前时间:{{ time }}</p> return render(request,&qu ...
- django 中模板语言的各种用法
模板 1.视图中使用模板 模版的创建过程,对于模版,其实就是读取模版(其中嵌套着模版标签),然后将 Model 中获取的数据插入到模版中,最后将信息返回给用户 1.普通方法:HTML被直接硬编码在 P ...
随机推荐
- 夯实Java基础(十八)——泛型
1.什么是泛型 泛型是Java1.5中出现的新特性,也是最重要的一个特性.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类. ...
- Linux系统资深运维工程师的进阶秘籍
2010年毕业,从事IT行业已经接近7个年头,一路走来有很多不足,不论是技术上的还是工作当中的待人接事等,但正是这些不足让我有了现在的进步,技术上从最初的做水晶头,综合布线到服务器上架,网络设备调试, ...
- canvas象棋 画图
今天写了一个canvas画图的象棋 .js基础不行,只画了个图,以后补充... <!DOCTYPE html> <html lang="en"> <h ...
- redis中关闭rdb跟aof
https://zm10.sm-tc.cn/?src=l4uLj8XQ0IiIiNGdip2KlJDRnJCS0JaRmZCbmouelpPSzc%2FJz8vJxtGXi5KT&uid=49 ...
- 二 Hibernate 改写学生管理系统的业务功能
public class StudentDaoImpl implements StudentDao { @Override /** * 查询所有学生 * * @throws SQLException ...
- Java项目xml相关配置
一.web.xml //设置会话过期时间,这里单位是分钟 <session-config> <session-timeout>30</session-timeout> ...
- 深入了解memcached
一.memcached如何支持高并发 Memcached使用多路复用 I/O模型(如epoll.select等).传统阻塞 I/O中,系统可能会因为某个用户连接还没做好 I/O准备而一直等待,直到这个 ...
- C2 - Skyscrapers (hard version)
前几天做的题,当时好像是超时了,这个博客写的超好https://blog.csdn.net/lucky52529/article/details/89155694 用单调站解决问题. 代码是从另外一篇 ...
- IDEA配置Scala开发环境
1.下载scala sdk 到页面 https://www.scala-lang.org/download/2.10.5.html 下载sdk,大数据平台目前的scala版本是2.10.5,下载后解压 ...
- 编程练习:实现树的层次遍历 (CVTE笔试)
直接层次遍历是比较简单的,但是题目要求的分层打印,这就变得稍微有些麻烦 我是采用两个队列的方法实现. 1.将树结构入队列1. 2.当队列1和队列2都不为空的时候,则一直循环. 3.当队列1不为空的时候 ...