django模板层
目录
模板层
后端朝前端页面传递数据的方式
# 第一种
return render(request, "index.html", {"n":n})
# 第二种
return render(request, "index.thml", locals()) # 将当前名称空间中的所有变量都传递给前端页面
前端接收值的方式
{{ 变量名 }}
注意:
后端传函数名到前端,会自动加括号调用,得到函数的返回值,但是不支持传参
后端传对象到前端,就相当于打印了这个对象
前端获取后端传过来的容器类型的内部元素,统一采用句点符(.)
dic = (a,b,c,d,e,f)
{{ dic }} # (a,b,c,d,e,f)
{{ dic.1}} # b # 数字对应的就是数据的索引
前端还能够调用python后端数据类型的一些不需要传参的内置方法
# 方法后面不需要加括号
{{ dic.items }}
{{ dic.keys }}
{{ dic.values }}
前端注释
会展示到前端的注释:
<!--原生的html注释-->
不会展示到前端的注释:
{#模板语法的注释#}
过滤器
后端文件:
def index(request):
n = 6969
s = '您好 我是 23 号技 师 很高兴 为您 服务,希望您 能满意!(不带换的'
# l = ['a','b','c','d','e','f','g']
l = []
d = {'name':'jason','password':'222','hobby':['看书','写字','琴棋书画']}
t = ('关某某','谢某某','陈某某','容嬷嬷')
st = {'python','java','php','golang'}
flag = 123
def func():
return '你调用了我?'
class Demo(object):
def __init__(self,name):
self.name = name
def func(self):
return self.name
@classmethod
def index(cls):
return 'cls'
@staticmethod
def bar(name,age):
return 'bar'
def __str__(self):
return '大帅比'
obj = Demo('jason')
print(obj)
# 第一种
# return render(request,'index.html',{'n':n})
# 第二种
file_size = 213213453
from datetime import datetime
ctime = datetime.now()
res = 'hello big ba by~ ~ba by ~baby~ baby~bab y~b aby~b aby~ba by~bab y~ba by~'
ht = '<h1>我是h1标签</h1>'
sr = '<script>alert(123)</script>'
from django.utils.safestring import mark_safe
xxx = mark_safe('<h1>我是h1标签</h1>')
return render(request,'index.html',locals())
前端文件过滤器演示:
前端统计字符串的长度>>>:{{ s|length }}
前端获取数据,如果是空的就返回default后面指定的默认参数值>>>:{{ flag|default:'值为空'}}
将数字格式化成标识文件大小的单位>>>:{{ file_size|filesizeformat }}
格式化时间(不要加%)>>>:{{ ctime|data:'Y-m-d' }}
字符串的切片操作>>>:{{ res|slice:0:8:2}} {#第三个数为步长#}
截取固定的长度的字符串 三个点也算计算长度>>>:{{ s|truncatechars:10 }}
按照空格截取文本内容>>>:{{ res|truncatewords:4}}
数字相加,如都不是int类型则按字符串拼接>>>:{{ 4|add:6 }}
{{ 'abc'|add:'efg' }}
重点:
将后端符合标签格式的数据 按照标签形式展现到前端页面上
{{ ht }}
{{ sr }}
这样子只会在前端显示字符串,需要给这些数据取消转义,这样前端就可识别标签内容从而显示到前端页面了
前后端取消转义的方法(*********):
前端
{{ ht|safe }}
{{ sr|safe }}
后端
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 %}
<!--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>中间的循环</p>
{% endfor %}
<!--empty-->
当你的for循环对象为空的时候回自动走empty代码块的代码
后端:
l = None
前端:
{% for foo in l %}
{% if forloop.first %}
<p>第一次循环</p>
{% elif forloop.last %}
<p>最后一次循环</p>
{% else %}
<p>中间的循环</p>
{% empty %}
<p>循环的容器类型是空,没法for循环</p>
{% endfor %}
自定义过滤器|标签|inclusion_tag
必须做的三件事
1、在应用文件夹下新建一个templatetags文件夹(必须叫这个名字)
2、在该新建的文件夹内新建一个任意名称的py文件
3、在该py文件中需要固定写下面两句代码
from django import template
register = template.Library()
自定义过滤器
# 在上面第二步新建的py文件中写上自定义过滤器的内容
# 自定义过滤器
# 方法一:
# 后端
@register.filter # 注册一个过滤器
def index(a,b):
return a+b
# 前端
{% load my_tag %} # 必须先在需要使用的html页面加载写着自定义过滤器的py文件
{{ 666|index:22} # 正常的使用一个过滤器的方法使用自定义的过滤器
# 方法二:
# 后端
@register.filter(name="xbb") # 注册一个过滤器,过滤器名用name来定义,定义了之后就没法使用下面函数名来调用过滤器了
def index(a,b):
return a+b
前端使用过滤器:
{% load my_tag %} # 必须先在需要使用的html页面加载写着自定义过滤器的py文件
{{ 666|xbb:22}} # 正常的使用一个过滤器的方法使用自定义的过滤器
自定义标签
# 自定义标签也是由通用的两种方式,定义了名字就无法使用函数名调用自定义标签了
# 在上面第二步新建的py文件中写上自定义标签的内容
# 自定义标签
# 后端
@register.simple_tag(name="dbb")
def plus(a,b,c):
return a+b+c
# 前端
{% load my_tag %}
{% dbb 1 2 3 %} # 标签传参数是以空格分隔的
自定义inclusion_tag
@register.inclusion_tag("login_html",name="login")
def login(n):
l = ["第%s项"%i for i in range(n)]
return {"l":l} # 将l 传入login_html文件中去
# login.html:不写其他内容,只写:
<ul>
{% for foo in l %}
<li>{{ foo }}</li>
{% endfor %}
</ul>
# 调用
{% login 5 %}
# 意思就是把内容放到name="login"的"login.html"中渲染,然后在要调用渲染结果的页面使用login调用该渲染结果
注意:
!!!!使用自定义过滤器、标签、inclusion_tag的html页面一定要能够被跳转访问才行,如:return render(request,"test.html")
要想使用自定义的过滤器、标签、inclusion_tag,必须先在需要使用的html页面加载你的py文件
{% load my_tag %}
{{ 666|xbb:22 }}
{% plus 1 2 3 %}
{% login 5 %}
自定义过滤器与标签的区别
自定义过滤器
是用 {{ }}调用
最多只能传两个参数
不可以没有参数
自定义标签
是用{% %}调用
不限制参数个数
可以没有参数,直接在html中调用,相当于调用一个无参函数
模板的继承与导入
首先需要在被继承的模板中划分多个区域
{% block 给区域起的名字 %}
继承的内容
{% 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">
</form>
{% endblock %}
# 即 将名叫content的区域的内容修改为要修改的内容
模板的导入
将一段html当做模块的方式导入到另一个html中展示
{% include "想导入的html文件名" %}
静态文件配置
{% load static %}
# 参考路由反向解析原理
<link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二种方式