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 第五天 自定义标签 静态文件
昨日忘记上传,先预留位置,稍后补上
随机推荐
- server2003 IIS6.0 网站不可用
事件 ID ( 487 )的描述(在资源( Zend Optimizer )中)无法找到.本地计算机可能没有必要的注册信息或消息 DLL 文件来从远程计算机显示消息.您可能可以使用 /AUXSOURC ...
- go -- go 程序 启动docker容器
package main import ( "io" "log" "os" "time" "github.co ...
- python创建缩略图和选择轮廓效果
# -*- encoding:utf-8 -*- ''' 改变颜色 --- 颜色反转''' from PIL import Image nest = Image.open("D:\\tk.j ...
- IIS 7中添加FTP站点并设置指定用户访问
1. 开启 FTP 和 IIS 服务功能: 2. 添加新用户: 打开计算机管理界面: 展开“本地用户与组”: 邮件点击“用户”->点击“创建新用户”: 在创建新用户对话框输入用户 ...
- sci会议和sci期刊区别是什么
sci会议和sci期刊区别是什么?从名称上来看就很明显了,一个是学术会议,一个是学术期刊,是不同的学术研究载体,不论是会议论文还是期刊论文,都是受认可的,就目前来看,发表期刊论文的作者要偏多一些,主要 ...
- SEO前端篇(一)页面布局
由于工作需要,在此对seo的一些相关知识做一个总结. 首先要了解必要的基础知识,什么是SEO以及搜索引擎的工作原理.这样才能继续下面的话题. 一.SEO定义 SEO全称:Search English ...
- 初进python世界之数据类型
文章来源: https://www.cnblogs.com/seagullunix/articles/7297946.html 基本运算符 常用数据类型: 字符串(Str) 数字(Digit) 列表( ...
- 最新 浩德钢圈java校招面经 (含整理过的面试题大全)
从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.浩德钢圈等10家互联网公司的校招Offer,因为某些自身原因最终选择了浩德钢圈.6.7月主要是做系统复习.项目复盘.Leet ...
- C#易失域、锁的分享,多线程
C#多线程.易失域.锁的分享 一.多线程 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公 ...
- java的特性与优势
java的特性与优势 简单性 面向对象 可移植性 高性能 分布式 动态性 多线程 安全性 健壮性