Django模板层
Posted majingjie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django模板层相关的知识,希望对你有一定的参考价值。
模板层
后端向前端页面传递数据方式
第一种
def index(request):
n = 1
return render(request,'index.html', 'n':n)
第二种
def index(request):
n = 1
return render(request,'index.html', locals())
# 将当前所在的名称空间中的名字全部传递给前端页面
后端向前端页面传递不同类型数据
n = 6>>> 6 # 数字
s = 'hello'>>>hello # 字符串
l = ['a','b','c']>>>['a','b','c'] # 列表
d = 'name':'jason','password':'222'>>>'name':'jason','password':'222' # 字典
t = ('1','2','3','4')>>>('1','2','3','4') # 元组
st = 'python','java','php','go'>>>'python','java','php','go' # 集合
# 后端传函数名到前端,会自动加括号调用,显示return的值,但是不支持传参
# 后端传对象到前端,就相当于打印了这个对象
前端操作后端数据
前端获取后端传过来的容器类型的内部元素,统一采用句点符(.)
('关某某','谢某某','陈某某','容嬷嬷')>>>: t , t.1 # 数字对应的就是数据的索引
前端能够调用python后端数据类型的一些不需要传参的内置方法
'name':'jason','password':'222'
>>> d.keys
>>> d.values
>>> d.items
模板语法的注释(不会展示到前端页面)
#调用python自带的内置方法,可以调用不传参数的一些内置方法 #
原生html注释(会展示到前端)
<!--我是原生的html注释-->
过滤器
<p>前端统计字符串的长度: s|length </p>
<p>前端获取数据如果是空就返回default后面默认的参数值: flag|default:'你这个东西是个空' </p>
<p>将数字格式化成表示文件大小的单位: file_size|filesizeformat </p>
<p> ctime </p>
<p>格式化时间(不要加百万分号): ctime|date:'Y-m-d' </p>
<p>字符串的切片操作: res|slice:'0:8' </p>
<p> res|slice:'0:8:2' </p>
<p>截取固定的长度的字符串 三个点也算: s|truncatechars:10 </p>
<p>按照空格截取文本内容: res|truncatewords:4 </p>
<p> 'hahah'|add:'heheheh' </p>
<p> ht </p> <!-- ht = '<h1>我是h1标签</h1>'-->
<p> sr </p> <!--'<script>alert(123)</script>'-->
<p> ht|safe </p>
<p> sr|safe </p>
前后端取消转义
前端
<p> ht </p> <!-- ht = '<h1>我是h1标签</h1>'-->
<p> sr </p> <!--'<script>alert(123)</script>'-->
<p> ht|safe </p>
<p> sr|safe </p>
后端
from django.utils.safestring import mark_safe
xxx = mark_safe('<h1>我是h1标签</h1>')
标签
for循环
% for foo in l %
<p> foo </p>
<p> forloop </p>
% endfor %
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter |
当前循环的索引值(从1开始) |
forloop.counter0 |
当前循环的索引值(从0开始) |
forloop.revcounter |
当前循环的倒序索引值(从1开始) |
forloop.revcounter0 |
当前循环的倒序索引值(从0开始) |
forloop.first |
当前循环是不是第一次循环(布尔值) |
forloop.last |
当前循环是不是最后一次循环(布尔值) |
forloop.parentloop |
本层循环的外层循环 |
if判断
% if flag %
<p>flag不为空</p>
% else %
<p>flag是空</p>
% endif %
嵌套使用
% for foo in l %
% if forloop.first %
<p>第一次</p>
% elif forloop.last %
<p>最后一次</p>
% else %
<p>1</p>
% endif %
% endfor %
empty
当for循环对象为空的时候会自动走empty代码块的内容
% for user in user_list %
<li> user.name </li>
% empty %
<li>空空如也</li>
% endfor %
自定义过滤器
必须做的三件事
在应用名下新建一个名为templatetags的文件夹(必须叫这个名字)
在该新建的文件夹内新建一个任意名称的py文件
在该py文件中需要固定写下面两句代码
from django import template register = template.Library()
自定义过滤器
@register.filter(name='过滤器名')
def index(a,b):
return a+b
自定义标签
# 自定义标签
@register.simple_tag
def plus(a,b,c):
return a+b+cc
自定义inclusion_tag
# 自定义inclusion_tag
@register.inclusion_tag('html文件名',name='自定义名字')
def login(n):
l = [ '第%s项'%i for i in range(n)]
return 'l':l
html文件
<ul>
% for foo in l %
<li> foo </li>
% endfor %
</ul>
调用
% 标签名 5 %
注意 :要想使用自定义的过滤器 标签 inclusion_tag 必须先在需要使用的html页面加载你的py文件
% load 'py文件名' %
模板的继承和导入
首先需要在被继承到的模板中划分多个区域
% block 给区域起的名字 %
html代码。。。
% endblock %
通常情况下一个模板中应该至少有三块
% block css %
页面css代码块
% endblock %
% block js %
页面js代码块
% endblock %
% block content %
页面主体内容
% endblock %
子模板的继承
先继承模板所有的内容
% extends 'home.html' %
然后根据block块的名字修改指定区域的内容
% block content %
<h1>登录页面</h1>
<form action="">
<p>username:<input type="text" class="form-control"></p>
<p>password:<input type="text" class="form-control"></p>
<input type="submit" class="btn btn-success">
% endblock %
模板的导入
将一段HTML当做模块的方式导入到另一个html展示
% include '导入的html文件名' %
静态文件配置
% load static %
<!--第一种方式-->
<link rel='stylesheet' href="% static 'css/mycss.css'%">
<!--第二种方式-->
<link rel='stylesheet' href="% get_static_prefix %css/mycss.css">
以上是关于Django模板层的主要内容,如果未能解决你的问题,请参考以下文章