模板语法传值
{{}}:变量相关
{%%}:逻辑相关
#模板语法可以传递的后端python类型数据--->基本上python后端的都能到前端去#后端def home(request):n = 123f = 12.12s = '你懂得'b = Falsel = [11,22,33,44]t = (11,22,33,44)d = {'username':'yo','age':'20','hobby':'happy'}se = {'第一','第二','第三'}class MyClass(object):def get_one:return 'one'@classmethoddef get_cls(cls):return 'cls'@staticmethoddef get_sta():return 'sta'#obj=MyClass()#调用语法return render(request,'index.html',locals())#前端<p>{{ s }}</p><p>{{ n }}</p><p>{{ f }}</p><p>{{ b }}</p><p>{{ l }}</p><p>{{ t }}</p><p>{{ d }}</p><p>{{ se }}</p><p>{{ func }}</p>--->传递函数名会自动加括号调用 但是模版语法不支持给函数传额外的参数:{{ func }}<p>{{ MyClass }}</p>传类名的时候也会自动加括号调用(实例化){{ MyClass }}<p>{{ MyClass.get_cls }}</p>基于上述内容可以得出,无论后端有没有实例化类,在前端只要调用了类中的方法一样能够执行,因为已经自动添加了括号进行调用<p>{{ MyClass.get_one }}</p> <---> <p>{{ obj.get_one }}</p> 同理<p>{{ MyClass.get_sta }}</p>django模板语法的取值只有一种方式,那就是.没有其他调用方法后端li = [1,2,3,4,{'name':'yo'}]前端<p>{{ li.4.name }}</p>
过滤器(过滤器只能最多有两个参数)
# 过滤器就类似于是模版语法内置的 内置方法# django内置有60多个过滤器不需要学这么多 了解10个左右就差不多了 后面碰到了再去记忆基本语法{{数据|过滤器:参数}}#转义#前端转义{{xxx|safe}}#后端转义from django.utils.safestring import mark_saferes = mark_safe('<h1>嗯哼</h1>')#以后能够后端转义尽量后端转义,前端转义容易造成xss注入<p>统计长度:{{ n|length }}</p><p>默认值(第一个参数布尔值是True就展示第一个参数的值否在展示冒号后面的值):{{ b|default:'就这?' }}</p><p>判断文件大小:{{ n|filesizeformat }}</p><p>日期格式化:{{ time|date:'Y-m-d' }}</p><p>切片操作:{{ s|slice:'0:2:1' }}</p><p>切分字符{{ s|truncatechars:5 }}</p>{#--->新含义-->(2.x以后...只占一个格子,且若是切分字符数等于字符数,那么不会显示...)#}<p>切取单词(不包含三个点 按照空格切){{ s|truncatewords:5 }}</p><p>移除特定的字符:{{ s|cut:' ' }}</p><p>拼接操作{{ l|join:'$' }}</p><p>拼接操作(加法):{{ n|add:10 }}</p><p>拼接操作(加法):{{ s|add:n }}</p><p>转义:{{ sss|safe }}</p><p>转义:{{ res }}</p>--后端转义
标签
#for循环{% for i in l %}<p>{{forloop}}</p>{% endfor %}forloop---> 变量获取循环序号{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 4, 'revcounter0': 3, 'first': True, 'last': False}forloop.counter: 顺序获取循环序号,从 1 开始计算forloop.counter0: 顺序获取循环序号,从 0 开始计算forloop.revcounter: 倒叙获取循环序号,结尾序号为 1(不重要)forloop.revcounter0: 倒叙获取循环序号,结尾序号为 0(不重要)forloop.first(一般配合if标签使用): 第一条数据返回 True,其他数据返回 Falseforloop.last(一般配合if标签使用): 最后一条数据返回 True,其他数据返回 False#if判断{% if b %}<p>正确</p>{% elif f %}<p>正确2</p>{% else %}<p>错误</p>#for 和 if 混用{% for i in lli %}{% if forloop.first %}<p>'这是第一个'</p>{% elif forloop.last %}<p>'这是最后一个'</p>{% else %}<p>{{ i }}</p>{% endif %}{% empty %}<p>for循环的可迭代对象内部没有元素 根本没法循环</p>{% endfor %}# 处理字典其他方法{% for foo in d.keys %}<p>{{ foo }}</p>{% endfor %}{% for foo in d.values %}<p>{{ foo }}</p>{% endfor %}{% for foo in d.items %}<p>{{ foo }}</p>{% endfor %}#with起别名{% with li.4.1.1.key as key %}<h1>{{ key }}</h1>{% endwith %}起别名作用:直接上栗子后端:li = [1,2,3,4,['dd',['ddd',{'key':'123'}]]]-->挺离谱的前端获取{{ li.4.1.1.key }}那么如果这个元素要被用很多次,重复的调用就会显得代码非常冗余这个时候就可以使用with起别名,在body下套个with就行了
自定义过滤器、标签、inclusion_tag
'''三部曲1.在应用下创建一个名字 必须为 templatetags文件夹2.在该文件夹内创建任意名称的py文件 --->名字随便起3.在py文件内必须有以下两句话(一个字符都不能错)from django import templateregister = template.Library()'''#自定义过滤器@register.filter(name='haha')def ddd(value,value2):return value - value2{#{{ n|haha:n2 }}#}#自定义标签@register.simple_tag(name='plus')def index(a,b,c,d):return '%s-%s-%s-%s'%(a,b,c,d){#<p>{% plus 'egon' 'jason' 'tank' 'yo' %}</p>#类似于python中的函数#}# 自定义inclusion_tag"""内部原理先定义一个方法在页面上调用该方法 并且可以传值该方法会生成一些数据然后传递给一个html页面之后将渲染好的结果放到调用的位置"""@register.inclusion_tag('left_menu.html')def left(n):data = ['第{}项'.format(i) for i in range(n)]# 第一种# return {'data':data} # 将data传递给left_menu.html# 第二种return locals() # 将data传递给left_menu.html{% left 5 %}# 总结:当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部 那么就考虑将该局部页面做成inclusion_tag形式(在讲bbs的时候会使用到)
模板的继承
"""你们有没有见过一些网站这些网站页面整体都大差不差 只是某一些局部在做变化"""# 模版的继承 你自己先选好一个你要想继承的模版页面{% extends 'home.html' %}# 继承了之后子页面跟模版页面长的是一模一样的 你需要在模版页面上提前划定可以被修改的区域{% block content %}模版内容{% endblock %}# 子页面就可以声明想要修改哪块划定了的区域{% block content %}子页面内容{% endblock %}# 一般情况下模版页面上应该至少有三块可以被修改的区域1.css区域2.html区域3.js区域{% block css %}{% endblock %}{% block content %}{% endblock %}{% block js %}{% endblock %}# 每一个子页面就都可以有自己独有的css代码 html代码 js代码"""一般情况下 模版的页面上划定的区域越多 那么该模版的扩展性就越高但是如果太多 那还不如自己直接写"""
模板导入
"""将页面的某一个局部当成模块的形式哪个地方需要就可以直接导入使用即可"""{% include 'wasai.html' %}
思考题目
"""1.反向解析的本质是什么,无名和有名反向解析如何操作?2..路由分发能够实现的前提是什么,需要注意什么,名称空间什么时候使用3..什么是虚拟环境,django1.X与django2.X/3.X的区别有哪些4.诠释为何跨语言传输数据以json格式为主,django返回json格式数据方式有哪些,又有哪些注意事项和配置参数"""
