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块 ----->写子页面独特的内容

  • 注意

  1. {% extends 'base.html' %} 写在第一行 前面不要有内容 有内容会显示
  2. {% extends 'base.html' %} 'base.html' 加上引号 不然当做变量去查找
  3. 把要显示的内容写在block块中
  4. 定义多个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">&laquo;</span>
    </a>
    </li> {% for i in num %}
    <li><a href="#">{{ i }}</a></li>
    {% endfor %} <li>
    <a href="#" aria-label="Next">
    <span aria-hidden="true">&raquo;</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:母版、继承、组件、自定义标签的更多相关文章

  1. Django 模板 语法 变量 过滤器 模板继承 组件 自定义标签和过滤器 静态文件相关

    本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法   模板渲染的官方文档 关于模板渲染你只需要记两种特殊符号(语法 ...

  2. Django-模板继承/组件/自定义标签

    一.标签tags for标签 遍历每一个元素:  写个for,然后 tab键自动生成for循环的结构,循环很基础,就这么简单的用,没有什么break之类的,复杂一些的功能,你要通过js def get ...

  3. Django模板导入及母版继承和自定义返回Html片段

    1.ROOT_URLCONF = '总路由所在路径(比如untitled.urls)'<===默认情况是这样 根路由的路径是可以修改的:ROOT_URLCONF = app01.urls< ...

  4. Django基础(2)--模板自定义标签和过滤器,模板继承 (extend),Django的模型层-ORM简介

    没整理完 昨日回顾: 视图函数: request对象 request.path 请求路径 request.GET GET请求数据 QueryDict {} request.POST POST请求数据 ...

  5. django -- 母版继承

    csrf_token 在之前我们提交post请求的时候,都是在setting.py文件里注释掉了 'django.middleware.csrf.CsrfViewMiddleware' 这一行,这是因 ...

  6. python - django (母版与组件)

    # 把多个页面通用的部分提取出来 放在一个母版中 # 其它的页面只需要继承 母版就可以 # 使用步骤:( 继承的语句要放在第一行 ) """ 1. 把公用的 HTML 部 ...

  7. Django【第16篇】:Django之Form组件自定义验证规则

    自定义验证规则以及中间件简单介绍 1.python2和python3中的区别 对于python2内置的字符串类型有str和unicode 比如:"abc"是字符串,u"你 ...

  8. Django的form组件——自定义校验函数

    from django.shortcuts import render,HttpResponse from django import forms from django.core.exception ...

  9. django 第五天 自定义标签 静态文件

    昨日忘记上传,先预留位置,稍后补上

随机推荐

  1. pdf 翻译

    某某狗 https://www.fanyigou.com/tslg/share/4DO875ON.htm

  2. Zookeeper运维常用四字命令

    Zookeeper运维常用四字命令 echo stat|nc 127.0.0.1 2181 查看哪个节点被选择作为follower或者leader 使用echo ruok|nc 127.0.0.1 2 ...

  3. SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录

    本文主要向大家介绍了SQLServer数据库之SQL Server 获取本周,本月,本年等时间内记录,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. datediff(we ...

  4. 在本地搭建hyperledger fabric 网络

    参考了官方文档,直接就可以了https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html 很好用 ➜ ~ cd $GOP ...

  5. node 部署教程二

    转:https://www.cnblogs.com/yesyes/p/7168449.html 这篇文章主要介绍如何在服务端跑vuejs的项目,如果上一篇教程你成功输出了hello world,那这一 ...

  6. C# default(T)关键字

    C#关键词default函数,default(T)可以得到该类型的默认值. C#在类初始化时,会给未显示赋值的字段.属性赋上默认值,但是值变量却不会. 值变量可以使用默认构造函数赋值,或者使用defa ...

  7. Electron 入门第一篇

    官网:http://electronjs.org/docs/tutorial/application-architecture 转载:https://blog.csdn.net/qq_33323731 ...

  8. http请求传参问题解决

    1.接口参数:使用form-data形式传参如果值太多就会报错误. 2.接口参数:使用form-data形式传参如果值太多就会报错误.这样前端可以传json就可以避免这样问题

  9. Android adb临时关闭Selinux

    在eng/userdebug版本中 使用getenforce 命令查询当前权限状态,如:adb shell getenforce 使用setenforce 命令进行设置:adb shell seten ...

  10. EasyNVR网页Chrome无插件播放安防摄像机视频流是怎么做到web浏览器延时一秒内

    背景说明 由于互联网的飞速发展,传统安防摄像头的视频监控直播与互联网直播相结合是大势所趋.传统安防的直播大多在一个局域网内,在播放的客户端上也是有所限制,一般都需要OCX Web插件进行直播.对于安防 ...