Python Web框架——Django学习的第五天(模板层和url(视图)的交互,模板层——过滤器和继承)
一:模板层——变量和标签
1.模板的变量:
在模板中使用变量语法:
- {{变量名}}
- 列表/数组:{{变量名.index}}
- 字典:{{变量名.key}}
- {{对象.方法}}
- {{函数名}}
样例:
home.html
<h3>int 是 {{ int }}</h3><h3>str 是 {{ str }}</h3><h3>lst 是 {{ lst }}</h3><h3>lst 是 {{ lst.0 }}</h3><h3>dict 是 {{ dict }}</h3><h3>dict['a'] 是 {{ dict.a }}</h3><h3>function 是 {{ func }}</h3><h3>clas_obj 是 {{class_obj.say }}</h3>
view.py
def test_template(request): dic = {} dic['int'] = 88 dic['str'] = 'guoxiaonao' dic['lst'] = ['Tom','Jack','Lily'] dic['dict'] = {'a':9,'b':8} dic['func'] = say_hi dic['class_obj'] = Dog() return render(request,'home.html',dic)def say_hi(): return 'hahaha'class Dog(): def say(self): return "wamgwang"
2.模板标签
作用:将一些服务器端的功能嵌入到模板中,例如流程控制等
标签语法:{% 标签 %} ············ {% 结束标签 %}
if标签:
语法:
注意:
(1)if条件表达式例可以用的运算符 == ,!=,,=,in,not in,is,is not,not,adn,or
(2)在if标记中使用实际括号是无效的语法。如果您需要他们指示优先级,则用使用嵌套的if标记
官方文档:https://www.djangoproject.com/
test_if_for.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>测试 if 和 for</title></head><body>{% if x > 10 %}今天天气很很好{% else %}今天天气非常好{% endif %}</body></html>
views.py
def test_if_for(request): dic = {} dic['x'] = 10 return render(request,'test_if_for.html',dic)
模板标签——for标签
语法:
{% for 变量 in 可迭代对象 %} ````循环语句{% empty %} ····可迭代对象无数据时填充的语句{% endfor %}
作业:使用Django写一个运算器,运算器能够保存上次的运算结果
答案看下面
二:模板层——过滤器和继承
1.模板过滤器
-
定义:在变量输出时对变量的值进行处理
-
作用:
可以通过使用过滤器来改变变量的输出显示
-
语法:{{ 变量 | 过滤器1:’参数1’ |过滤器2:‘参数2’····}}
常用过滤器
过滤器 | 说明 |
---|---|
lower | 将字符串转换为全部小写 |
upper | 将字符串转换为大写形式 |
safe | 默认不对变量内的字符串进行html转义 |
add:“n” | 将value的值增加n |
truncatechars:‘n’ | 如果字符串多余指定的字符数量,那么会被截断。阶段的字符串将以可翻译的省略号序列(”~~“0结尾 |
以上用法直接在html中的{{}}(后端像前端传数据的变量后添加即可)
样例:
<h3>str 是 {{ str|upper }}</h3><h3>int 是 {{ int|add:"60" }}</h3>
safe:不对html进行转义(即对从后台传入的数据依然按照原格式)
样例:
view.py
dic['script'] = '<script>alert(1111111)</script>
html中的代码
<h3>script {{ script|safe }}</h3>
结果该页面会弹出一个框
2.模板层——继承
模板继承可以使父模板的内容重用名字模板直接继承父模板的全部内容并可以覆盖父模板中相应的块。
语法——父模板中:
- 定义父模板中的快block标签
- 标识出那些在子模块中识别是允许被修改的
- block标签:在父模板中定义,可以在子模版中覆盖
语法——子模版:
- 继承子模版extends标签(写在模板文件的第一行)
例如:{% extends ‘base.html' %}
- 子模版 重写父模板中的内容块
{% block block_name %}子模版快用来覆盖父模板中 block_name 块的内容{% endblock block_name %}
重写的覆盖规则:
- 不重写,将按照父模板的效果显示
- 重写,则按照重写效果显示
注意:
- 模板继承时,服务器端的动态表内容无法继承