一、后端朝前端发送数据的方式
第一种:
return render(request,'index.html',{'n':n})
第二种:
return render(request,'index.html',locals())
第二种方式会将当前名称空间的所有名字全部传递到前端,即模板层。
注:
![]()
- 后端传函数名到前端,会自动加括号调用,但是不支持传参;
- 后端传对象到前端,就相当于打印了这个对象;
- 前端获取到后端传递过来的容器类型,统一采用句点符(.)取值,例如:{{ ls.1 }} ,这里数字指的是索引。{{ d.key }},针对字典取值
- 前端能够调用python后端数据类型的一些不需要传参的内置方法
二、注释
不会展示到前端页面(即在浏览器检查源码时这个注释是不显示的):
{# 这是模板语言的注释 #}
三、渲染变量
views.py的代码:
def index(request):
n = 6969
s = '桃李春风一杯酒,江湖夜雨十年灯'
l = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
d = {'name': '战狼', 'password': '123', 'hobby':['耍枪', '弄棒', '装逼']}
t = ('赵铁锤', '王大炮', '李银弹', '刘志鹏')
st = {'python', 'java', 'swift', 'golang'}
flag = None
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 't[3]真是个大帅比'
obj = Demo('sgt')
return render(request, 'index.html', locals())
有些经常要用的变量,但是要拿到它写的代码过长,那么可以使用with起别名。
![]()
四、过滤器
在Django的模板语言中,通过使用 过滤器 来改变变量的显示。
过滤器的语法: {{ value|filter_name:参数 }}
使用管道符"|"来应用过滤器。
例如:{{ name|lower }}会将name变量应用lower过滤器之后再显示它的值。lower在这里的作用是将文本全都变成小写。
注意事项:
- 过滤器支持“链式”操作。即一个过滤器的输出作为另一个过滤器的输入。
- 过滤器可以接受参数,例如:{{ sss|truncatewords:30 }},这将显示sss的前30个词。
- 过滤器参数包含空格的话,必须用引号包裹起来。比如使用逗号和空格去连接一个列表中的元素,如:{{ list|join:', ' }}
- '|'左右没有空格没有空格没有空格
views.py的代码:
def index(request):
s = '桃李春风一杯酒,江湖夜雨十年灯'
flag = None
file_size = 213213453
from datetime import datetime
ctime = datetime.now()
res = 'hello big ba by ba by bab y baby b ab y'
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())
index.html----此处是一些过滤器的用法举例
<p>前端统计字符串的长度:{{ s|length }}</p>
<p>获取数据如果是空就返回default后的默认值:{{ flag|default:'为空啊' }}</p>
<p>将数字格式化成表示文件大小的单位:{{ file_size|filesizeformat }}</p>
<p>{{ ctime }}</p>
<p>格式化时间:{{ ctime|date:'Y-m-d H:i:s' }}</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>{{ 'haha'|add:'hehe' }}</p>
{#重点#}
<p>{{ ht }}</p>
<p>{{ sr }}</p>
{#通过过滤器“|safe”的方式告诉Django这段代码是安全的不必转义。#}
<p>{{ ht|safe }}</p>
{#使其能够弹窗#}
<p>{{ sr|safe }}</p>
{#xxx在后端利用mark_safe模块进行了标记#}
<p>{{ xxx }}</p>
此处需要注意一个取消转义的标记:
前端取消转义:
{{ h|safe }}
后端取消转义:
from django.utils.safestring import mark_safe
h = mark_safe('<h1>我是h1标签</h1>')
join拼接(此处以空格做拼接符)
五、标签(tags)
5.1、普通for循环
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
for循环可用的一些参数:
Variable | Description |
---|---|
forloop.counter | 当前循环的索引值(从1开始) |
forloop.counter0 | 当前循环的索引值(从0开始) |
forloop.revcounter | 当前循环的倒序索引值(从1开始) |
forloop.revcounter0 | 当前循环的倒序索引值(从0开始) |
forloop.first | 当前循环是不是第一次循环(布尔值) |
forloop.last | 当前循环是不是最后一次循环(布尔值) |
forloop.parentloop | 本层循环的外层循环 |
for……empty:当你的for循环对象为空的时候会自动走empty代码块儿的内容
后端:
l = None
前端:
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来!!!</p>
{% endif %}
{% empty %}
<p>你给我的容器类型是个空啊,没法for循环</p>
{% endfor %}
5.2、if判断
{% if flag %}
<p>flag不为空</p>
{% else %}
<p>flag是空</p>
{% endif %}
5.3、嵌套使用
{% for foo in l %}
{% if forloop.first %}
<p>这是我的第一次</p>
{% elif forloop.last %}
<p>这是最后一次了啊</p>
{% else %}
<p>嗨起来!!!</p>
{% endif %}
{% endfor %}
六、自定义过滤器、自定义标签、自定义inclusion_tag
在自定义这些之前需要做的三件事:
- 在应用下新建一个templatetags文件夹,必须叫这个名字
- 在新建的templatetags文件夹内新建一个任意名称的py文件(我的叫:my_tag.py)
- 在该py文件中需要固定写下面两句代码
from django import template register = template.Library()
6.1、自定义过滤器
自定义过滤器只能是带有一个或两个参数的Python函数。
from django import template register = template.Library() # 自定义过滤器 @register.filter(name='XBB') def index(a, b): return a + b
然后导入到模板层使用:
{% load my_tag %} {{ 10|XBB:10 }}
![]()
6.2、自定义标签
@register.simple_tag def plus(a, b, c): return a+b+c
模板层使用:
{# 第一步一定要先注册(load) #} {% load my_tag %} {% plus 1 2 3 %}
6.3、自定义inclusion_tag
原型: django.template.Library.inclusion_tag()
主要作用:通过渲染一个模板来显示一些数据
例如,Django的Admin界面使用自定义模板标签显示"添加/更改"表单页面底部的按钮。这些按钮看起来总是相同,但链接的目标却是根据正在编辑的对象而变化的。
前端,把多余的都删掉,在login.html中写一段代码。
<ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %} </ul>
后端:
@register.inclusion_tag('login.html', name='login') def login(n): l = ['第%s项'%i for i in range(n)] return {'l': l}
index.html中使用:前端调用login,走了login函数,然后把l交给了login.html渲染,最后返回到了index.html页面。
{% load my_tag %} {% login 5 %}
最后注意:
如果想要使用自定义的过滤器,标签,inclusion_tag,必须先在需要使用的html页面加载templatetags下的py文件。
即 {% load my_tag %}
七、模板的继承与导入
首先需要在被继承的模板中划分多个区域:
{% block 给区域起的名字 %} 继承的代码 {% endblock %}
通常情况下,一个模板中应该至少有3块划分的区域:
{% 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 %}
模板的导入:
将一段html当做模块的方式导入到另一个html展示。
{% include '想导入的html文件名' %}
举例:
如上的页面,导航条和侧边栏要在其他页面重复使用,只需要修改绿色框圈出的巨幕区域。那么首先要给巨幕划分一个块,并给它取名为content。
上面的home.html是主页。如果我的注册页面reg.html想用它,只对巨幕的那块做修改,可以如下操作:
访问它,发现其他都保留,只有巨幕换成了注册:
有了上面的经验,如果我们想写一个登录呢?然后我们还想给这个登录继承一些其他的东西:
![]()
hualihushao.html
![]()
八、静态文件配置
首先在settings.py配置文件中注册静态文件夹:
然后在文件中load并使用:
在最前面加这句:
{% load static %}
然后用下面的导入方式导入:
<link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一种方式
<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二种方式