django-模板语法
模板语法 在html页面中,可以直接使用python中的变量 在views.py中,我有几个变量想渲染到页面 from django.shortcuts import render def

django-模板语法

发布时间:2023-11-23 (2023-11-23)

模板语法

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

如果你不进行复写,那么就会使用模板中的内容进行渲染