Django:母版、继承、组件、自定义标签
1.for循环应用
1.1for
| Variable | Description |
|---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(到1结束) |
forloop.revcounter0 |
当前循环的倒序索引值(到0结束) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
- 示例:
#views.py
def temp(request):
lst1 = ["swiming",'dumpwater',"go boating"]
lst2 = ["basketball","football","pingpang"]
lst3 = ["run100","run1500","run400"]
lst_all = [lst1,lst2,lst3]
return render(request,"temp.html",{"lst1":lst1,"lst_all":lst_all})
temp.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{% for water in lst1 %}
<p>{{ forloop.counter }}-{{ water }}</p>
{% endfor %}
</body>
</html>
显示效果

当{{forloop.counter}} 换成{{forloop}}结果就是如下:

例题:把lst_all所有信息打印
<body>
<table border="1">
<thead>
<tr>
<th>项目1</th>
<th>项目2</th>
<th>项目3</th>
</tr>
</thead>
{% for temp in lst_all %}
<tr>
{% for i in temp %}
<td>{{ i }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
</body>
- 显示效果

1.2for...empty
若项目所有项目为空,图下显示效果,让用户感觉好像没有加载完毕

用for...empty优化
<body>
<table border="1">
<thead>
<tr>
<th>项目1</th>
<th>项目2</th>
<th>项目3</th>
</tr>
</thead>
{#注意此时 lst_all为空#}
{% for temp in lst_all %}
<tr>
{% for i in temp %}
<td>{{ i }}</td> {% endfor %}
</tr>
{% empty %}
<td colspan="3" style="text-align:center;">空空如也</td>
{% endfor %} </table>
</body>
显示效果:

1.3 if...elif 和else
{% if 5 > 2 %}
5大于2
{% elif 5 == 2 %}
5等于2
{% else %}
5小于2
{% endif %}
if 语句还支持and,or,==,>,<,!=,<=,>=,in,not in,is,is not 判断
{% if 5 > 2 and 2 > 1 %}
真
{% else %}
假
{% endif %}
{#真#}
{% if 5 > 2 > 1 %}
真
{% else %}
假
{% endif %}
{#假#}
注意:模板中不支持连续判断。python中支持连续判断,但模板中不支持连续判断,JavaScript也不支持连续判断,不支持算数运算。
| 语言判断 | 解析 | 结果 |
|---|---|---|
| python--->(10>5>1) | 10>5 and 5>1 | True |
| JavaScript--->(10>5>1) | 10>5 -->True--> 1>1 --->False | False |
| 模板中--->(10>5>1) | 10>5-->True--> 1>1 --->False | False |
1.4 with语句
- 定义一个中间变量
{#方法1#}
{% with youyong=lst_all.0.0 %}{#注意等号左右不能有空格#}
{{ youyong }}
{% endwith %}
{#方法2#}
{% with lst_all.0.0 as youyong %}
{{ youyong }}
{% endwith %}
{#swiming#}
1.5 Django模板语言中属性的优先级大于方法
#定义一个字典d有属性items值为100,本身字典d有items方法,传入templates层。
def temp(request):
d = {"a":1,"items":"100"}
return render(request,"temp.html",{"data":d})
html前端:
{{ data.items }}
{#100#}
- 结果为100 ,可以证明模板语言中属性的优先级大于方法
2.Csrf_token
- 用于跨站请求伪造保护
- 在页面的form表单里面写上{%csrf_token%}

同时也可以把:中间件MIDDLEWARE 里面内容 django.middleware.csrf.CsrfViewMiddleware,取消掉注释了
3.母版
3.1母版
为什么用母版,母版可以把公用部分HTML提取出来放到公用base.html文件,便于维护和使用。
在base.html中,通过定义block,把每个页面不同部分区分出来。
在具体页面中先继承母版
然后block名去指定替换母版中相应位置。

母版:一个普通HTML提取多个页面的公共部分,定义block快
<!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 块名称 %}
{% endblock %}
</body>
</html>
3.2块
语法: {{% block xxxx %}}
通过在母板中使用
{% block xxx %}来定义"块"。在子页面中通过定义母板中的block名来对应替换母板中相应的内容。
3.3继承
语法:{% extends "base.html "%}
重写block块 ----->写子页面独特的内容
注意:
- {% extends 'base.html' %} 写在第一行 前面不要有内容 有内容会显示
- {% extends 'base.html' %} 'base.html' 加上引号 不然当做变量去查找
- 把要显示的内容写在block块中
- 定义多个block块,定义 css js 块
- 母版内容:

- 继承版内容

子页面如何定义自己CSS样式(JS也一样)
- 主页面设置CSS的block快

- 子页面写入自己CSS样式

3.4组件
- 语法:{%include "xxxxx.html"}
- 将常用的页面内容如导航条,页尾信息等组件保存在单独的文件中,然后在需要使用的地方按如下语法导入即可。

在templates文件下新建nav.html

<!--导航条代码-->
<nav class="navbar navbar-inverse navbar-fixed-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar"
aria-expanded="false" aria-controls="navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Project name</a>
</div>
<div id="navbar" class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li><a href="/exit/">exit</a></li>
<li><a href="#">Settings</a></li>
<li><a href="#">Profile</a></li>
<li><a href="#" style="color:red;font-size: 20px; "><strong>{{ uname }}</strong></a></li>
</ul>
<form class="navbar-form navbar-right">
<input type="text" class="form-control" placeholder="Search...">
</form>
</div>
</div>
</nav>
- 在母版语句相应位置导入导航条:

4.静态文件
- settings文件内配置的STATIC_URL=“/static/”,在以后项目部署的时候有可能变更,当一旦改动STATIC_URL将会出错。
- 通过用静态文件方法优化,避免路径写死了。
- 语法:{% load static %}
- 在母版文件中:{% load static %}

{% load static %}
<link rel="stylesheet" href="{% static '/plugins/bootstrap-3.3.7/css/bootstrap.css' %}">
<link rel="stylesheet" href="{% static '/css/dsb.css' %}">
{#导入static,然后放入到link的href内与css路径拼接,static从setting中找到STATIC_URL名字,然后和后面写的路径拼接。这样无论settings改变STATIC_URL为什么都不会报错#}
注意:{% load static %} 与 {% load staticfiles %} 一样,用谁都行
拓展:{%get_static_prefix%}
{#在base.html写入如下,会在html源码中显示/static/#}
<h1>{%get_static_prefix%}</h1>由此可见,它的功能是获取settings内STATIC_URL的名字。

这样也可以用如下写法也成立:
<link rel="stylesheet" href="{%get_static_prefix%}css/dsb.css">
5.自定义标签
5.1 simpletag
filter最多传入2个参数,但simpletag可以传入任意参数,创建与自定义filter一样
在templatetags下创建my_tags.py文件,写入方法,
from django import template
register = template.Library() @register.simple_tag
def join_str(*args,**kwargs):
return "{} - {}".format("*".join(args),"&".join(kwargs.values()))
在temp.html导入方法使用
{% load my_tags %}
{% join_str '1' '2' k1='3' k2='4' %} {#切记等号左右不允许有空格}
注意:切记等号左右不允许有空格
显示效果:

5.2 inclusion_tag
多用于返回html代码片段。相比组件,inclusion_tag返回代码字段是灵活的,根据你提供的参数是变化的。
它与filter和simpletag不同在于它返回的是一个字典,字典作用于render一样,要把字典交给页面渲染
分页功能使用
- 首先设置page.html片段
<nav aria-label="Page navigation">
<ul class="pagination">
<li>
<a href="#" aria-label="Previous">
<span aria-hidden="true">«</span>
</a>
</li> {% for i in num %}
<li><a href="#">{{ i }}</a></li>
{% endfor %} <li>
<a href="#" aria-label="Next">
<span aria-hidden="true">»</span>
</a>
</li>
</ul>
</nav>
- 被调用:然后在templatetags下my_tags.py写函数
@register.inclusion_tag("page.html")
def page(num):
return {"num":range(1,num+1)}

调用部分:在主页面渲染

关系如下:

5.3 filter,simpletag,inclusion_tag区别
- filter:是过滤器{{}},返回值任意指定,装饰器写法不一样
- simpletag:是标签{%%},返回值任意指定,装饰器写法不一样
- inclusion_tag:是标签{%%}。返回值是一个字典,交给模版渲染,装饰器写法不一样
5.4 XSS攻击
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
@register.filter
def foo(vaules):
a = """
<script>
for (var i=0;i<10;i++) {
alert('你中毒了')
}
</script>
"""
return a
Django:母版、继承、组件、自定义标签的更多相关文章
- Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关
本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...
- Django-模板继承/组件/自定义标签
一.标签tags for标签 遍历每一个元素: 写个for,然后 tab键自动生成for循环的结构,循环很基础,就这么简单的用,没有什么break之类的,复杂一些的功能,你要通过js def get ...
- Django模板导入及母版继承和自定义返回Html片段
1.ROOT_URLCONF = '总路由所在路径(比如untitled.urls)'<===默认情况是这样 根路由的路径是可以修改的:ROOT_URLCONF = app01.urls< ...
- Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介
没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...
- django -- 母版继承
csrf_token 在之前我们提交post请求的时候,都是在setting.py文件里注释掉了 'django.middleware.csrf.CsrfViewMiddleware' 这一行,这是因 ...
- python - django (母版与组件)
# 把多个页面通用的部分提取出来 放在一个母版中 # 其它的页面只需要继承 母版就可以 # 使用步骤:( 继承的语句要放在第一行 ) """ 1. 把公用的 HTML 部 ...
- Django【第16篇】:Django之Form组件自定义验证规则
自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...
- Django的form组件——自定义校验函数
from django.shortcuts import render,HttpResponse from django import forms from django.core.exception ...
- django 第五天 自定义标签 静态文件
昨日忘记上传,先预留位置,稍后补上
随机推荐
- pdf 翻译
某某狗 https://www.fanyigou.com/tslg/share/4DO875ON.htm
- Zookeeper运维常用四字命令
Zookeeper运维常用四字命令 echo stat|nc 127.0.0.1 2181 查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2 ...
- SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录
本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...
- 在本地搭建hyperledger fabric 网络
参考了官方文档,直接就可以了https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 很好用 ➜ ~ cd $GOP ...
- node 部署教程二
转:https://www.cnblogs.com/yesyes/p/7168449.html 这篇文章主要介绍如何在服务端跑vuejs的项目,如果上一篇教程你成功输出了hello world,那这一 ...
- C# default(T)关键字
C#关键词default函数,default(T)可以得到该类型的默认值. C#在类初始化时,会给未显示赋值的字段.属性赋上默认值,但是值变量却不会. 值变量可以使用默认构造函数赋值,或者使用defa ...
- Electron 入门第一篇
官网:http://electronjs.org/docs/tutorial/application-architecture 转载:https://blog.csdn.net/qq_33323731 ...
- http请求传参问题解决
1.接口参数:使用form-data形式传参如果值太多就会报错误. 2.接口参数:使用form-data形式传参如果值太多就会报错误.这样前端可以传json就可以避免这样问题
- Android adb临时关闭Selinux
在eng/userdebug版本中 使用getenforce 命令查询当前权限状态,如:adb shell getenforce 使用setenforce 命令进行设置:adb shell seten ...
- EasyNVR网页Chrome无插件播放安防摄像机视频流是怎么做到web浏览器延时一秒内
背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCX Web插件进行直播.对于安防 ...