模板语法
在html页面中,可以直接使用python中的变量
在views.py中,我有几个变量想渲染到页面
from django.shortcuts import render
def index(request):
name = '张三'
age = 21
lis = [1, 2, 3, '法外狂徒张三']
dic = {'name': '张三三', 'age': 22}
# 如何将这些变量渲染在页面中呢?
# 在render中,还有一个参数,帮助我们将后端的变量提交到前端
return render(request, 'index.html', {
'name': name,
'age': age,
'lis': lis,
'dic': dic,
})
在前端页面中,如何使用这些变量? 或者是一个列表,如何遍历?
<!--如何渲染单个变量?-->
<p>{{ name }}</p>
<p>{{ age }}</p>
<p>{{ lis }}</p>
<p>{{ dic }}</p>
<!--如何遍历列表或字典?-->
{% for li in lis %}
<p>{{ forloop.counter }} -- {{ li }}</p>
{% endfor %}
{% for d in dic.items %}
<p>{{ d }}</p>
<p>{{ d.0 }}{{ d.1 }}</p>
{% endfor %}
<!--判断,如果age大于10,我就出现某某字-->
{% if age > 10 %}
<!--变量与判断的内容 这里必须有空格-->
<p>age大于10</p>
{% else %}
<p>age太小了</p>
{% endif %}
<!--深度查询-->
<!--无论是取列表的值,还是取字典的值,又或者执行函数,统统用点(.)取值-->
[1, 2, 3, 4, 5, 6, 7, ['a', 'b', 'c', [1, 'd', 3]]]
<!--例如取这个'd',应该怎么取呢?-->
{{ lis.7.3.1 }}
<!--执行函数也是如此,不过现在还不能执行带参数的函数-->
过滤器
过滤器,顾名思义,按照某种格式进行过滤
常用的过滤器如下:
日期格式化: date {{ val|date:'Y-m-d H:M:S' }}
默认值: default {{ val|default:'默认值' }}
返回对象的长度: length
随机返回列表中的数: random
将字符正常显示: safe
去除html标签: striptags
截取字符: truncatechars
两个数相加: add
常用的过滤器远远不够使用,怎么办呢?
如:hyuhd.jpg,获取这个字符的结尾 两个数相乘
就需要自己写一个过滤器
自定义过滤器
- 在app下创建一个templatetags这个名称的包,注意:必须是这个名字
- 在这个包下创建一个py文件,名字顺便取(my_tags)
- 在这个py文件下创建如下代码,这里也是固定写法
from django import template
register = template.Library()
- 自定义过滤器,只需要写一个函数即可,例如写一个乘法过滤器
from django import template
register = template.Library()
# 自定义过滤器
@register.filter
def sub(a, b):
return a * b
- 前端使用
{% load my_tags %}
<!--需要导入才能在之后使用这个模块里面的函数-->
<p>{{ 2|sub:3 }}</p>
- 首次使用,需要手动重启django
标签
在之前自定义过滤器的时候,有些常见无法使用自定义过滤器完成
例如:三个数相加
标签我们已经用过了,for,url, if这些都是django中的标签
都被放在 {% %} 中
自定义标签
在我们之前那个py文件中,再新建一个函数
@register.simple_tag
def add_tree(a, b, c):
return a + b + c
前端使用
{% load my_tags %}
<p>{% add_tree 1 2 3 %}</p>
继承
继承是一个比较有趣的内容
它可以将你的页面排布的更加统一
例如在你的页面中,我整体使用一种模板
<!DOCTYPE html>
<html lang="ch">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
这是模板文件
{% endblock %}
</title>
</head>
<body>
<div class="content">
{% block content %}
这是模板文件的主要内容
{% endblock %}
</div>
</body>
</html>
在{% block %}中的内容,将会被替换掉
如果我的index界面需要继承base.html,那么我只需要这么做
{% extends 'base.html' %}
{% block title %}
index
{% endblock %}
{% block content %}
index中的内容
{% endblock %}
如果你不进行复写,那么就会使用模板中的内容进行渲染