Django(5) 模版层
模版层
一、模版语法之传值
view视图层
def func1(request):
x = 1 y = '哈哈哈'
l = [1, 2, 3]
z = {'name': 'judy'}
def func():
return '加油哦'
return render(request, 'func1.html', locals())-->利用locals()可以将后端数据一股脑扔到前端页面,前端页面用双层大括号接收即可。
# 将后端数据传给页面的方法:
# 方式1:
# 利用local() --> 这是一股脑儿传进去所有的东西,所以有点浪费资源
# return render(request,'func1.html',locals())
# 方式2:
# return render(request,'func1.html',{'x':x})
# 利用大括号精确传值,就是如果值多的话,就会很麻烦 templates
模版层
<p>{{ x }}</p>
<p>{{ y }}</p>
<p>{{ l }}</p>
<p>{{ z }}</p>
<p>{{ func }}</p>-->接收函数名会自动加上括号调用并且返回函数的返回值在页面上,不支持穿参数,所以只能是无参函数,传递类名会自动实例化成对象,传递对象就是对象,对象可以点属性和方法,另外,模版语法支持python所有的数据类型。模版层拿值就是双层大括号括起来
模版语法取值
Django模版语法取值只能用句点符号
<p>{{ l.2 }}</p>
<p>{{ z.name }}</p>
模版语法之过滤器 模版语法过滤利用竖杠|
1、统计长度
<p>{{ l|length }}</p>
<p>{{ z|length }}</p>
2、加法运算
<p>{{ x|add:1000000 }}</p>
3、在视图层函数写sss='<h1>加油<h1>' h1标签在传递给前端后,不会渲染成一级标签,如果需要渲染成一级标签,正确的写法是<p>{{ sss|safe }}</p>,或者也可以在视图层利用模块:
from django.utils.safestring import mark_safe
sss1=mark_safe('<h1>加油<h1>')
4、truncatechars
<p>{{ y|truncatechars:1 }}</p>
默认在后面加上三个点...,数字里面会自动包含三个点,例如y的值为北京,
<p>{{ y|truncatewords:1}}</p> 以空格为分界线,数字不包含三个点
-->生产环境根据情况分析吧
5、<p>{{ y|add:'xxx' }}</p> 字符串拼接
6、<p>{{ b|default:'嘻嘻' }}</p> 如果b布尔值为True,直接打印b本身的值
<p>{{ b1|default:'哈哈' }}</p> 如果b布尔值为False,直接打印|后面的值
模版语法之流程控制
1、if判断
在模版层html文件中写if判断只需要 if+tab键
{% if b %}
<p>有值</p>
{% elif b %}
<p>嘻嘻</p>
{% else %}
<p>哈哈</p>
{% endif %}
2、for循环 for+tab健
{% for foo in b %}
<p>{{ forloop }}</p>
{% endfor %}
3、两者结合使用
{% for foo in l %}
{% if forloop.first %} -->forloop是记录循环情况的对象
<p>这是第一次循环</p>
{% elif forloop.last %}
<P>这是最后一次循环</P>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% endfor %}
4、{{}}和{%%}的使用
{{}} 和变量有关
{%%}和逻辑相关
5、for循环中当传入的数据是空的
{%empty%}
<p>传入的数据是空的</p>
6、起别名
{%with d.hobby.3.username as name%}
{{name}}
{%endwith%}
自定义过滤器,标签,inclusion_tag
1、自定义过滤器类似于python里面的自定义函数
具体用法如下:
(1)必须在应用下创建一个名为itemplatetags的文件夹
(2)在上述文件夹中创建一个任意名称的py文件 比如mytag.py
(3)先写下面两句话,再编写自己的过滤器
from django import templates
register = template.Library()
@register.filter(name='myfilter')
def index(a+b):-->前端只能接收两个参数,可以使用字符串拼接来增加参数的个数
return a+b
(4)在前端页面使用
先加载:{%load mytag%}
再使用:{{x|myfilter:66}}-->相当于 传过来的x这个值加上66
2、自定义标签
自定义标签就是流程控制
具体使用:
(1)和上面一样先导入
(2)前后端语法
后端
@register.simple_tag(name='mysimple')
def func1(a,b,c,d):
return '%s-%s|%s?%s' %(a,b,c,d)
前端 {% mysimple 1 'amber' 222 'judy' %}
3、inclusion_tag
(1)在templates文件夹中创建login.html
(2)在mytag.py文件中写tag
@register.inclusion_tag('login.html', name='my_inclusion_tag')--》将结果发送给login.html
def func2(n):
l = ['第%s页' % i for i in range(1, n+1)]
return locals()-->将for循环所有的数据发送给login.html
(3)在我们前端显示页面上
{% load mytag %}
{% my_inclusion_tag 10 %}
当某一块内容数据经常使用,并且数据不是固定的
模版的导入
{%%include '模版名'}
模版的继承
案例
1、以bootstrap框架为例,去官网下载所需要的静态文件,同时在项目跟目录下新建一个static文件夹,将下载好的静态文件放到里面
2、在setting.py 里面加入静态文件配置文件
STATICFILES_DIRS = (os.path.join(BASE_DIR, ‘static’), )
3、在bootstrap找一组组件进行练习,在base.html中
{% load static %} -->这两句话就是动态解析
<link rel="stylesheet" href="{% static 'css/Bootstrap.min.css' %}"/>
再复制粘贴从官网的下来的文件
4、先使用block打标记
{%block 区域名称%}
这里放base.html可以被改动的地方
{%endblock%}
5、子版继承
{%extends 'base.html'%}
{%block 区域名%}
写新的东西
{%endblock%}
模版在划定区域的时候,一般都应该有三个区域,css区,html文档区域,js区域。
{{block.super}} 继承父类的方式