模板层
模版语法重点:
变量:{{ 变量名 }}
1 深度查询 用句点符
2 过滤器
标签:{{% % }}
views.py
from django.shortcuts import render
from django.http import JsonResponse
# Create your views here.
def index(request):
name = 'lqz'
age = 18
ll = [1, 2, 'lqz', 'egon']
ll2=[]
dic2={}
tu = (1, 2, 3)
dic = {'name': 'lqz', 'age': 18, 'll': [1, 2, 4]}
# 函数
def test():
print('lqz')
return 'zhouxiang dsb'
# 在模板上相当于执行该函数,并打印
print(test())
# 类和对象
class Person():
def __init__(self, name, age):
self.name = name
self.age = age
def get_name(self):
return self.name
@classmethod
def cls_test(cls):
return 'cls'
@staticmethod
def static_test():
return 'static'
# 模板里不支持带参数
def get_name_cs(self,ttt):
return self.name
lqz=Person('lqz',18)
egon=Person('egon',18)
person_list=[lqz,egon]
person_dic={'lqz':lqz}
file_size=1024
import datetime
ctim=datetime.datetime.now()
h1='<h1>你好</h1>'
script='<script>alert(111)</script>'
# user='lqz'
user=''
# return render(request,'index.html',{'name':name})
# locals() 会把*该*视图函数内的变量,传到模板
return render(request, 'index.html', locals())
1.模板语法变量
HTML
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
{#模板语言注释:前端看不到#}
{#相当于print了该变量#}
<h1>模板语言之变量</h1>
<p>字符串:{{ name }}</p>
<p>数字:{{ age }}</p>
<p>列表:{{ ll }}</p>
<p>元祖:{{ tu }}</p>
<p>字典:{{ dic }}</p>
{#只写函数名:相当于函数名(),执行该函数#}
<p>函数:{{ test }}</p>
{#对象内存地址#}
<p>对象:{{ lqz }}</p>
<p>列表套对象:{{ person_list }}</p>
<p>字典套对象:{{ person_dic }}</p>
<hr>
<h1>深度查询</h1>
<p>列表第0个值:{{ ll.0 }}</p>
<p>列表第3个值:{{ ll.3 }}</p>
<p>字典取值:{{ dic.name }}</p>
<p>字典取列表值:{{ dic.ll }}</p>
{#再继续取值,继续点#}
<p>对象取数据属性:{{ lqz.name }}</p>
<p>对象取绑定给对象的函数属性:{{ lqz.get_name }}</p>
<p>对象取绑定给类的函数属性:{{ lqz.cls_test }}</p>
<p>对象取静态方法:{{ lqz.static_test }}</p>
<p>把对象列表中egon年龄取出来:{{ person_list.1.age }}</p>
{#拓展:不能调有参数的方法#}
<p>字符串的方法:{{ name.upper }}</p>
</body>
</html>
2.模板语法过滤器
-语法:{{第一个参数|过滤器名字:第二个参数}}
-常用过滤器:(详细用法见源码)
-length
-default
-slice
-date
-filesizeformat
-truncatechars
-truncatewords
-safe
-add
HTML
<h1>模板语言之过滤器</h1>
{#后面就是个python中的函数,|前面的,是函数的第一个参数,冒号后面的是第二个参数#}
<p>统计字符串长度:{{ name|length }}</p>
<p>统计列表长度:{{ ll|length }}</p>
<p>过滤器之默认值:{{ ll2|default:'没有值' }}</p>
<p>过滤器之filesizeformat--1:{{ 201334444444444444443|filesizeformat }}</p>
<p>过滤器之filesizeformat--2:{{ file_size|filesizeformat }}</p>
<p>过滤器之不使用date:{{ ctim }}</p>
<p>过滤器之date:{{ ctim|date:'Y-m-d' }}</p>
{#前闭后开区间#}
<p>过滤器之slice:{{ ll|slice:'2:-1' }}</p>
{#支持步长#}
<p>过滤器之slice-字符串:{{ name|slice:'0:3:3' }}</p>
{#三个起步#}
<p>过滤器之truncatechars:{{ 'dafddfafgadfgaasdgadgfadaf'|truncatechars:5 }}</p>
<p>过滤器之truncatewords:{{ '我 dfaf ga dfgaas 你 dgf adaf'|truncatewords:5 }}</p>
<p>过滤器之不用safe:{{ h1 }}</p>
<p>过滤器之用safe:{{ h1|safe }}</p>
<p>过滤器之不用safe:{{ script }}</p>
{#<p>过滤器之用safe:{{ script|safe }}</p>#}
<p>过滤器之用add:{{ 12|add:'1' }}</p>
<p>过滤器之用add:{{ 'egon'|add:'dsb' }}</p>
3.模板语法标签
-{% 标签 %}
-for:forloop:对象(里面有好多东西:parentloop,last,first,counter....)忘记的话, 自己打印一下
empty:被循环的对象是空,才走它
for循环可以嵌套,也可以用if
-if:
{% if forloop.first %}
<p>第一次的我 </p>
{% elif forloop.last %}
<p>最后的我 </p>
{% else %}
<p>{{ foo }}</p>吧
{% endif %}
-with:重命名,应用在变量名过长
********都要有结束********
HTML
<h1>模板语言之标签</h1>
{% for foo in ll %}
{{ forloop }}
<p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
{% endfor %}
{% for foo in ll %}
{% for i in person_list %}
取出外层是第几次循环
{{ forloop.parentloop.counter }}
<p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
{% endfor %}
{% endfor %}
{#**************循环的对象是空,才会走到empty,而不是对象里面的东西为空#}
{% for foo in dic2 %}
<p>{{ foo }}</p>
{% empty %}
傻逼了
{% endfor %}
{#只循环字典的话,取到的是key值#}
{% for foo in dic %}
{#取到value的值#}
{% for foo in dic.values %}
{#取到key 和 value的值#}
{% for k,foo in dic.items %}
<p>{{ k }}----->{{ foo }}</p>
{% empty %}
傻逼了
{% endfor %}
{% if user %}
<a href="">退出</a>
{% else %}
<a href="">登录</a>
<a href="">注册</a>
{% endif %}
{#for循环判断如果是第一次,打印第一次,其他打印正常值#}
{% for foo in ll %}
{% if forloop.first %}
<p>第一次的我 </p>
{% elif forloop.last %}
<p>最后的我 </p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
<hr>
with 相当于取别名,作用:变量太长,可以简化
{% with name as ttt %}
{{ ttt }}
{{ name }}
{{ user }}
{% endwith %}
{% with dic.ll.2 as ttt %}
{{ ttt }}
{{ ttt }}
{% endwith %}
4.自定义过滤器和标签
标签不能用在if判断中,过滤器可以用在if判断中
-自定义过滤器
-1 先确认app是不是已经在setting中注册
-2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
-3 在模块下创建一个py文件,名字随意:mytag.py
-4 # 第一步,导入template
from django.template import Library
# 第二步,定义一个叫register的变量=template.Library()
register = Library()
-5 写一个函数,用@register.filter(name='yyy')装饰一下(可以指定别名)
def str_add(str1, str2): #一定要有返回值
# 业务逻辑很复杂
return str1 + str2
-6 在模板里:(新定定义的标签,过滤器,都要重启程序)
-{% load mytag %}
-{{'lqz'|str_add:'nb'}}
-自定义标签:
-1 先确认app是不是已经在setting中注册
-2 在app下创建一个templatetags(****名字不能变***)的文件夹(模块)
-3 在模块下创建一个py文件,名字随意:mytag.py
-4 # 第一步,导入template
from django.template import Library
# 第二步,定义一个叫register的变量=template.Library()
register = Library()
-5 只是装饰器不一样
@register.simple_tag()
def add_nb(value):
return value+'nb'
-6 在模板里:(多个参数,以空格区分)
-{% load mytag %}
-{% add_nb 'lqz'%}
5.模板的导入与继承
模板的导入:
模板的继承:
1. 写一个母版,留一个可扩展的区域(盒子),可以留多个盒子(留的越多,可扩展性越高) {%block 名字%} 可以写内容 {%endblock%}
2. 在子模板中使用: {%block 名字%} 子模板的内容 {%endblock 名字%}
6.静态文件相关配置
1 写死静态文件:<link rel="stylesheet" href="/static/css/mycss.css">
2 使用 static标签函数:
-{%load static%}
#static返回值,会拼上传参的路径
-{% static "传参"%}
<link rel="stylesheet" href="{% static 'css/mycss.css' %}">
3 使用get_static_prefix 标签
-{%load static%}
#get_static_prefix返回值是:静态文件的地址,相当于/static/
-{% get_static_prefix %}css/mycss.css
<link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">