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 }}

posted on 2019-05-17 11:03  doubtful  阅读(141)  评论(0编辑  收藏  举报

导航