模板层变量
视图层能向模板传递哪些数据,其实python中所有数据类型都可以,str、int、list、tupple、dict、function以及class,在模板中的调用方法如下
- 首先在视图函数中定义不同的数据类型
def test_html(request):
from django.shortcuts import render
def fun():
return "This is a function"
class class_obj:
def fun(self):
return "This is a function of a class"
dic = {}
dic['str'] = 'str'
dic['int'] = 18
dic['list'] = ['list', 'i', 1]
dic['tup'] = ('tupple', 'i', 1)
dic['d'] = {'name': 'Django', 'language' : 'python'}
dic['fun'] = fun
dic['class'] = class_obj
return render(request, 'test.html', dic)
- 然后在模板中调用数据
<body>
<h1>str: {{ str }}</h1>
<h1>int: {{ int }}</h1>
<h1>list: {{ list }}</h1>
<h1>list[0]: {{ list.0 }}</h1>
<h1>tup: {{ tup }}</h1>
<h1>tup[0]: {{ tup.0 }}</h1>
<h1>dic: {{ d }}</h1>
<h1>dic['name']: {{ d.name }}</h1>
<h1>fun: {{ fun }}</h1>
<h1>class: {{ class }}</h1>
<h1>class.fun: {{ class.fun }}</h1>
</body>
从上面可以看到,想要调用视图函数的变量非常简单,只需要在{{}}
中写上render
函数中引用字典中键名即可,如果值是list和tupple需要注意想要取具体元素是通过list.index
的形式(例如list.0,list.1…),如果是字典和类,则是通过dic.key
或者class.method
,注意没有括号;函数即函数名
模板标签
- 作用:将服务器功能嵌入到模板层,例如流程控制
- 标签语法:
{% 标签 %} # {% if %}
...
{% 结束标签 %} # {% endif %}
- 需要注意的是,if/for等与python语法基本一致,只是需要在末尾添加结束标签,另外没有冒号结构
<,>,==,!=,>=,<=,in,not in,is ,is not, and ,or, not
都是可以使用的- 但是if中的括号是无效的不能设定优先级,若需要使用优先级需要使用嵌套的if标签
- if标签示例:
views.py
def test_if(request):
dic = {}
dic['a'] = 100
return render(request, 'test_if.html', dic)
test_if.html
<body>
{% if a == 100 %} # 在标签引用视图变量直接写变量名即可,不要双大括号
<h2>a就是100</h2>
{% elif a < 100 %}
<h2>a小于100 </h2>
{% else %}
<h2>a 大于100 </h2>
{% endif %}
</body>
- for标签
{% for 变量 in 可迭代对象 %}
... 循环语句
{% empty %}
... 可迭代对象为空时填充语句
{% endfor %}
示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
{% for i in age %}
<p>age is {{ i }}</p>
{% endfor %}
</body>
</html>
views.py
def test_for(request):
dic = {}
dic['age'] = [10, 20, 30, 40, 50]
return render(request, 'test_for.html', dic)