Django 模版语言
传入变量
{{ 变量名 }}
在 view.py 的函数返回 render 时在html文件名后传入一个字典,字典的 key 对应html文件中的变量名,value 为传入的值
views.py:
def func(request):
return render(request, "index.html", {'current_user': "bob"})
index.html:
<body>
<div>{{current_user}}</div>
</body>
最后生成的字符串
<body>
<div>bob</div>
</body>
循环
For循环
views.py:
def func(request):
return render(request, "index.html", {'current_user': "bob", 'user_list': ['bob','jack']})
index.html:
<body>
<div>{{current_user}}</div>
<ul>
{% for row in user_list %}
{% if row == "bob" %}
<li>{{ row }}</li>
{% endif %}
{% endfor %}
</ul>
</body>
字典循环
views.py:
USER_DICT = {
'1': {'name': 'user1', 'age': '12', 'gender': 'M'},
'2': {'name': 'user2', 'age': '12', 'gender': 'M'},
'3': {'name': 'user3', 'age': '12', 'gender': 'M'},
'4': {'name': 'user4', 'age': '12', 'gender': 'M'},
}
def show_dict(request):
return render(request, 'dict.html', {'user_dict': USER_DICT})
index.html:
- .keys: 只显示 key(默认状态)
<body>
<ul>
{% for i in user_dict.keys %}
<li>{{ i }}</li>
{% endfor %}
</ul>
</body>
输出:
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
- .values: 只显示 value
<body>
<ul>
{% for i in user_dict.values %}
<li>{{ i }}</li>
{% endfor %}
</ul>
</body>
输出:
<li>{'name': 'user1', 'age': '12', 'gender': 'M'}</li>
<li>{'name': 'user2', 'age': '12', 'gender': 'M'}</li>
<li>{'name': 'user3', 'age': '12', 'gender': 'M'}</li>
<li>{'name': 'user4', 'age': '12', 'gender': 'M'}</li>
- .items: 同时显示 key 和 value
<body>
<ul>
{% for i in user_dict.items %}
<li>{{ i }}</li>
{% endfor %}
</ul>
</body>
输出:
<li>('1', {'name': 'user1', 'age': '12', 'gender': 'M'})</li>
<li>('2', {'name': 'user2', 'age': '12', 'gender': 'M'})</li>
<li>('3', {'name': 'user3', 'age': '12', 'gender': 'M'})</li>
<li>('4', {'name': 'user4', 'age': '12', 'gender': 'M'})</li>
或
<body>
<ul>
{% for k, v in user_dict.items %}
<li>{{ k }}:{{ v }}</li>
{% endfor %}
</ul>
</body>
输出:
<li>1:{'name': 'user1', 'age': '12', 'gender': 'M'}</li>
<li>2:{'name': 'user2', 'age': '12', 'gender': 'M'}</li>
<li>3:{'name': 'user3', 'age': '12', 'gender': 'M'}</li>
<li>4:{'name': 'user4', 'age': '12', 'gender': 'M'}</li>
示例:
通过 a 标签提交 get 请求
<ul>
{#/detail/?nid= 方式#}
{% for k, v in user_dict.items %}
<li><a target="_blank" href="/detail/?nid={{ k }}">{{ v.name }}</a></li>
{% endfor %}
</ul>
<li><a target="_blank" href="/detail/?nid=1">user1</a></li>
<li><a target="_blank" href="/detail/?nid=2">user2</a></li>
<li><a target="_blank" href="/detail/?nid=3">user3</a></li>
<li><a target="_blank" href="/detail/?nid=4">user4</a></li>
循环计数
{% for i in list %}
{{ forloop.counter }} # 正序从1开始计数
{{ forloop.counter0 }} # 正序从0开始计数
{{ forloop.revcounter }} # 倒序从1开始计数
{{ forloop.revcounter0 }} # 倒序从0开始计数
{{ forloop.parentloop }} # 父循环计数,返回字典,包含forloop的所有七项(用于两层循环)
{{ forloop.first }} # 是否为第一个
{{ forloop.last }} # 是否为最后一个
{% endfor %}
索引
模版语言中不使用'[]'进行索引,而是直接'.'
views.py:
def func(request):
return render(request, "index.html", {
'current_user': "bob",
'user_list': ['bob','jack'],
'user_dict': {'k1': 'v1', 'k2': 'v2'}})
index.html:
<body>
<div>{{current_user}}</div>
<a> {{ user_list.1 }} </a>
<a> {{ user_dict.k1 }} </a>
<a> {{ user_dict.k2 }} </a>
</body>
判断
条件
views.py:
def func(request):
return render(request, "index.html", {
'current_user': "bob",
"age": 18,
index.html:
<body>
<div>{{current_user}}</div>
{% if age %}
<a>有年龄</a>
{% if age >= 18 %}
<a>成年</a>
{% else %}
<a>未成年</a>
{% endif %}
{% else %}
<a>无年龄</a>
{% endif %}
</body>
母版
母版通过{% block name %}{% endblock %}
确定子板插入位置
母版 html 文件
master.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>master</title>
<link rel="stylesheet" href="/static/common.css">
{% block css %}{% endblock %}
{# 插入CSS文件位置 #}
</head>
<body>
<div id="header">This is header</div>
<div>
<div id="left_menu">
<a href="/block-1.html">
<p>page1</p>
</a>
<a href="/block-2.html">
<p>page2</p>
</a>
<a href="/block-3.html">
<p>page3</p>
</a>
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</div>
<div id="footer">This is footer</div>
</body>
<script src="/static/jQuery3.4.1.js"></script>
{% block js %}{% endblock %}
{# 插入JS文件位置 #}
</html>
子板 html 文件
{% extends 'master.html' %}
{# 确定要应用的母版 #}
{% block css %}{% endblock %}
{# 插入CSS文件 #}
{% block content %}
<div>
<h1>This is page1.</h1>
{% include 'tag.html' %}
{% include 'tag.html' %}
{# 下面介绍{% include 'tag.html' %} #}
</div>
{% endblock %}
{# 插入内容 #}
{% block js %}{% endblock %}
{# 插入JS文件 #}
一个子板只能继承一个母版,但是可以插入多个 include
tag.html:
<a>一个小插件</a>
{% include 'tag.html' %}
会将整个html文件插入到指定位置
自定义函数
simple_tag
缺点:
不能作为if条件
优点:
可以传入任意数量参数,参数之间用空格隔开
步骤:
1.app下创建templatetags目录
2.目录下创建func.py文件
3.导入模块,创建对象
from django import template
register = template.Library()
4.写函数
@register.simple_tag
def func_s(a1, a2):
return a1 + a2
5.settings中注册APP
6..html文件顶部加载函数所在.py文件
{% load func %}
7.使用函数
{% func_s 2 4 %}
filter
缺点:
最多传入两个参数,不能加空格(可以将多个参数打包成一个参数传入,在函数中在解析)
优点:
能作为if条件
步骤:
1.app下创建templatetags目录
2.目录下创建.py文件
3.导入模块,创建对象
from django import template
register = template.Library()
4.写函数
@register.filter()
def func_f(a1, a2):
return a1 + a2
5.settings中注册APP
6..html文件顶部加载函数函数所在.py文件
{% load func %}
7.使用函数
{{ 2|func_f:4 }}