{{  }} 变量
list类型用 'lst.索引',且不支持倒序索引,即不能识别lst.-1
dic类型用 'dic.key',去取对应的value,不支持{}
对于实例对象,通常自己重写__str__,让返回的内容好看些
可以使用方法,例如'dic.keys',但不能使用()来启动方法,且被调用的方法也不能接收参数
注:当模板系统遇到 '.' 时,存在优先级
1.在字典中查询
2.属性或方法
3.数字索引
eg,若view函数中存在dic = {'keys':'xxx','name':12},
当在html中使用dic.keys时,取到的是xxx,而不是dict_keys(['keys', 'name'])
过滤器filter,作用:改变显示结果,语法{{变量名|filter_name:参数}}
-注意冒号:前后无空格,有空格就报错
-{{eqwe|default:参数}},eqwe在views中并没有定义或者是空,参数可以是int,string,或者是其它变量
-filesize=1025,{{ filesize|filesizeformat }} >>> 1.0 KB
-add,可以做算术运算(优先级>)字符串拼接(add:前后必须都是str类型),列表拼接(前后必须都是lst类型)
-lower小写,{{ value|lower }}
-upper大写,{{ value|upper}}
-length,{{ value|length }}返回value的长度,如 value=['a', 'b', 'c', 'd']的话,就显示4.
-slice切片,{{value|slice:"-2:0:-1"}}返'] 与切片的使用方法一样
-first取第一个,{{value|first }}
-last取最后一个,{{value|last }}
-join分割,{{lst|join:'|']
-truncatechars截断,{{ 'longstr'|truncatechars:5 }} >>> lo... ,最后三个.也要算在长度里面,只认英文,不认中文
-date,格式化时间,'time':datetime.datetime.now(),{{ time|date:'Y-m-d H:i:s' }},2019-11-10 14:29:58,记得是i和s,不是M和S
-date的另一种设置,在settings里面修改下面两种配置:
USE_L10N = False
DATETIME_FORMAT = 'Y-m-d H:i:s'
这样之后,只要django检查到参数time是时间格式的,就会自动把其格式转换成'Y-m-d H:i:s'
{{ time }} >>> 2019-11-10 14:34:57
-safe,告诉django不需要转义,比如:value = "<a href='#'>点我</a>",{{ value|safe }}
自定义filter
1.在app文件夹内创建一个名为'templatetags'的python包
-文件夹也可以,但官方文档说最好用包
-用了包之后,pycharm就可以加载这个包,在输入的时候,就可以智能补全,使用文件夹就没法智能提醒和补全
2.在这个包内新建一个my_tags.py文件,文件名可以任意
3.在这个文件中写入以下内容,register不能是其它名字,函数名可以任取
from django import template
register = template.Library()
@register.filter(name='haha') # haha就是add_xx函数的别名,使用的时候,要使用haha()
def add_xx(value,arg): # 最少一个参数(value),最多两个参数
return '{}-{}'.format(value,arg)
4.在html文件中
{% load my_tags %}
{{ 'wey'|add_xx:'sweet' }}
>>> wey-sweet day7 {% %} 标签
forloop
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(到1结束)
forloop.revcounter0 当前循环的倒序索引值(到0结束)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环
{# 需求:对行列均处于偶数位置的数据进行标红#} 要会使用forloop.parentloop
<table border="1">
<tbody>
{% for hobby in hobbies %}
<tr>
{% for hobby_in in hobby %}
{% if forloop.counter|divisibleby:2 and forloop.parentloop.counter|divisibleby:2 %}
<td style="color: red">{{ hobby_in }}</td>
{% else %}
<td>{{ hobby_in }}</td>
{% endif %}
{% endfor %}
</tr>
{% endfor %}
</tbody>
</table>
for...empty 去看图书馆里项目的/book_list/
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% empty %}
<li>空空如也</li>
{% endfor %}
</ul>
if...elif...else..endif, elif和else都不是必须项
注意: if语句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判断。
{% if user_list %}
用户人数:{{ user_list|length }}
{% elif black_list %}
黑名单数:{{ black_list|length }}
{% else %}
没有用户
{% endif %}
连续判断
python中 10>5>1, 10>5 and 5>1,True and True,True
模板中和js中,10>5>1,True>1,Flase,即不支持连续判断,而且也不支持 if 2 + 2 == 4,因为不识别+-*/
with 中间变量 改名字 仅仅在with里面才生效
{% with hobby=hobbies.2.2 %} # 等号前后不能有空格
{{ hobby }}
{% endwith %}
注释
{# ... #} 这是django的注释语法,里面的内容不会翻译,也不会放在最终的html文档中
<!-- {{ string }} --> 这时html的注释,里面的变量会被翻译,会被放在html文档中,但不会显示出来
csrf_token
csrf: 跨站请求伪造
form表单里面写上{% csrf_token %},就可以防止跨站伪造,且不用再在settings里面注释csrf了
原理: django在html里加了一个隐藏的input标签,其value是是给服务器做验证用的
<input type="hidden" name="csrfmiddlewaretoken" value="nwSD71CUEPor07CRbX7L2tkGZFGAPDOSWZSf1qANLlkngeMrn5EfBorazxYQsxKf">
母版和继承
母版:一个普通的html,其拥有了多个页面的公共部分,不同的地方用{% block 名字 %}{% endblock %}标记
继承:
首先引入母版{% extends 'base.html' %},注意引号(如果不加引号,那就是变量,需在render里传入相应的参数),且必须放在首行
然后在需要的地方使用{% block 名字 %}xxx{% endblock %}来修改母版中的内容,要修改的内容xxx必须写在block块中,否则不显示
在head最后加上{% block cs %}{% endblock %},给需要继承的页面留出空间,好加载其自己的css样式
在body最后加上{% block js %}{% endblock %},给需要继承的页面留出空间,好加载其自己的js样式
组件
插入一小段html代码,例如,把图书管理系统的导航栏单独拿出来
{% include 'navbar.html' %}
静态文件,load static 可以动态的去检索settings里面的STATIC_URL = '/static/',然后做拼接
{% load static %}
{% get_static_prefix %} {# /static/#}
<link rel="stylesheet" href="{% static '/plugins/bootstrap-3.3.7/css/bootstrap.css' %}">
<link rel="stylesheet" href="{% static '/css/dashboard.css' %}"> 自定义filter补充
-@register.simple_tag的使用,比@register.filter好用一些,因为可以传入任意数量的参数
在my_tags文件里设置
@register.simple_tag
def push(value,*args,**kwargs):
return '{}-{}-{}'.format(value,'#'.join(args),'$'.join(kwargs.values()))
在html使用的时候,设置
{% load my_tags %}
{% push lst '1' '2' k1='3' k2='4' k3='5' %}
# lst是render传过来的变量,类型是list,可以在这里使用,说明simple_tag对参数类型不限制
-@register.inclusion_tag('组件html全称'),可以传入任意数量的参数
在my_tags文件里设置
@register.inclusion_tag('组件html全称')
def page(num):
return {'num' : range(1,num+1)}
在html使用的时候,设置
{% load my_tags %}
{% page 2}
调用流程就是,2传给page函数,page函数return给组件html,
组件html通过{{num}}渲染完之后再交还到调用page的那个位置

Django_03_模板的使用的更多相关文章

  1. Jade模板引擎让你飞

    写在前面:现在jade改名成pug了 一.安装 npm install jade 二.基本使用 1.简单使用 p hello jade! 渲染后: <p>hello jade!</p ...

  2. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  3. CMS模板应用调研问卷

    截止目前,已经有数十家网站与我们合作,进行了MIP化改造,在搜索结果页也能看到"闪电标"的出现.除了改造方面的问题,MIP项目组被问到最多的就是:我用了wordpress,我用了织 ...

  4. PHP-自定义模板-学习笔记

    1.  开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2.  整体架构图 ...

  5. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  6. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  7. 前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定

    一.前端MVC概要 1.1.库与框架的区别 框架是一个软件的半成品,在全局范围内给了大的约束.库是工具,在单点上给我们提供功能.框架是依赖库的.AngularJS是框架而jQuery则是库. 1.2. ...

  8. ThinkPHP+Smarty模板中截取包含中英文混合的字符串乱码的解决方案

    好几天没写博客了,其实有好多需要总结的,因为最近一直在忙着做项目,但是困惑了几天的Smarty模板中截取包含中英文混合的字符串乱码的问题,终于解决了,所以记录下来,需要的朋友看一下: 出现乱码的原因: ...

  9. ThinkPHP 模板substr的截取字符串函数

    ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...

随机推荐

  1. How To Use The Repository Pattern In Laravel

    The Repository Pattern in Laravel is a very useful pattern with a couple of great uses. The first us ...

  2. SpringBoot监控中心

    1.什么是SpringBoot监控中心? 2.为什么要使用SpringBoot监控中心?

  3. NetworkX系列教程(10)-算法之四:拓扑排序与最大流问题

    小书匠Graph图论 重头戏部分来了,写到这里我感觉得仔细认真点了,可能在NetworkX中,实现某些算法就一句话的事,但是这个算法是做什么的,用在什么地方,原理是怎么样的,不清除,所以,我决定先把图 ...

  4. kaptcha 配置

    问题所在: 这一段配置,不要写在 SpringMVC 文件中,要写在 Spring 配置文件! <!-- kaptcha 验证码 --> <bean id="captcha ...

  5. Input类中常用的验证方式

    Deolin一般将Input类对象作为POST请求方法的参数, Input类的域与前端的数据结构一一对应,由于后端不应该相信前端传过来的任何数据, 所以前端的数据对象先绑定到Input对象中,通过JS ...

  6. slax自启动程序

    Fluxbox 本身提供了自启动程序的功能.~/.fluxbox/startup 文件是一个像启动 Fluxbox 一样自启动应用程序的脚本.# 标记是注释. 一个简单的例子: #!/bin/sh # ...

  7. $('#jyzjg').combobox('clear');

        $('#jyzjg').combobox('clear');                   alert($('#jyzjg').combobox("getValue" ...

  8. synchronized的原理与使用

    理论层面: 内置锁与互斥锁 修饰普通方法.修饰静态方法.修饰代码块 demo如下: package com.roocon.thread.t3; public class Sequence { priv ...

  9. 会话技术cookie与session

    目录 会话技术cookie 会话技术 cookie 服务器怎样把Cookie写 给客户端 服务器如何获取客户端携带的cookie session session简介 Session如何办到在一个ser ...

  10. THINKPHP扩展PHPEXCEL,PHP7.2以上版本无法导出Excel

     THINKPHP扩展PHPEXCEL与PHP7.3高版本兼容问题 框架:THINKPHP5,PHPEXCEL版本:1.81 无法导出EXCEL原因为Shared/OLE.php第290行使用cont ...