Django模板语法

Django模版语法

(1)传数据

  • 模版语法可以传递的后端python数据类型(可迭代)
  • 后端:
def test2(request):
    name = 'heart'
    float = 11.11
    str_name = '你好'
    boolean_test = True
    list_test = [1, 2, 3]
    tuple_test = (1, 2, 3)
    dict_test = {'name': 'heart', 'age': 18}
    set_test = {1, 2, 3, 4, 5, 5}
    return render(request,'mubanyufa.html', locals())
  • 前端:
<body>
{{ name }}
<br>
{{ float }}
<br>
{{ str_name }}
<br>
{{ boolean_test }}
<br>
{{ list_test }}
<br>
{{ tuple_test }}
<br>
{{ dict_test }}
<br>
{{ set_test }}
<br>
</body>
<!-- 
heart
11.11
你好
True
[1, 2, 3]
(1, 2, 3)
{'name': 'heart', 'age': 18}
{1, 2, 3, 4, 5} 
-->

(2)传函数

  • 传递函数名会自动加括号调用 但是模版语法不支持给函数传额外的参数

  • 后端:

def test2(request):
    name = 'heart'

    def func():
        return '这是一个函数'  # 一定要有返回值
    return render(request,'mubanyufa.html', locals())
  • 前端:
<body>
{{ func }} # 会自动调用 但是函数里面的参数传不进来
</body>

(3)传类

  • 传类名的时候也会自动加括号调用(实例化)
  • 后端:
def test2(request):
    class MyClass(object):
        def get_self(self):
            return 'self'

        @staticmethod
        def get_func():
            return 'func'

        @classmethod
        def get_class(cls):
            return 'cls'

    obj = MyClass()
    return render(request,'mubanyufa.html', locals())
  • 前端:
<body>
{{ MyClass }} # <app01.views.test2.<locals>.MyClass object at 0x000001DAA6A2E740>
{{ obj }} # <app01.views.test2.<locals>.MyClass object at 0x000001DAA69D6470>
{{ obj.get_class }} # cls
{{ obj.get_func }} # func
{{ obj.get_self }} # self
</body>

(4)小结

  • 内部能够自动判断出当前的变量名是否可以加括号调用 如果可以就会自动执行 针对的是函数名和类名

  • Django模版语法的取值 是固定的格式 只能用句点符 .

(5)过滤器

{{数据|过滤器:参数}}
{{ value|filter_name:参数 }}
  • 过滤器就类似于是模版语法内置方法
  1. date: 格式化日期。例如:{{ my_date|date:"Y-m-d" }}
  2. length: 获取列表或字符串的长度。例如:{{ my_list|length }}
  3. filesizeformat: 获取文件大小。例如:{{ my_file|filesizeformat}}
  4. default: 设置默认值。例如:{{ my_var|default:"No value" }}
  5. lower: 将字符串转换为小写。例如:{{ my_string|lower }}
  6. upper: 将字符串转换为大写。例如:{{ my_string|upper }}
  7. truncatechars: 截断字符串到指定长度。例如:{{ my_string|truncatechars:9 }}
  8. truncatewords: 截断单词到指定长度。例如:{{ my_string|truncatewords:9 }}
  9. safe: 转义。例如:{{ my_string|safe }}
  10. join: 拼接。例如:{{ my_string|join:'123' }}
  11. slice: 切片。例如:{{ my_string|slice:'0:4:2' }}
  12. cut: 移除指定字符。例如:{{ value|cut:'1' }}

(6)标签

(1)for循环

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

(2)for循环可用的一些参数

Variable Description
forloop.counter 当前循环的索引值(从1开始)
forloop.counter0 当前循环的索引值(从0开始)
forloop.revcounter 当前循环的倒序索引值(从1开始)
forloop.revcounter0 当前循环的倒序索引值(从0开始)
forloop.first 当前循环是不是第一次循环(布尔值)
forloop.last 当前循环是不是最后一次循环(布尔值)
forloop.parentloop 本层循环的外层循环

(3)if判断

(1)if elif else

{% if user_list %}
  用户人数:{{ user_list|length }}
{% elif black_list %}
  黑名单数:{{ black_list|length }}
{% else %}
  没有用户
{% endif %}

(2)if和else

{% if user_list|length > 5 %}
  你好
{% else %}
    世界
{% endif %}

(4)with

  • 定义一个中间变量,多用于给一个复杂的变量起别名。
  • 注意等号左右不要加空格。
{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}
{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

(5)csrf_token

  • 这个标签用于跨站请求伪造保护。
  • 在页面的form表单里面写上

(6)forloop

list = ["你好", "我好", "大家好"]
{% for re in list %}

    <p>{{ forloop }}</p>

{% endfor %}
标签
{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 3, 'revcounter0': 2, 'first': True, 'last': False}

{'parentloop': {}, 'counter0': 1, 'counter': 2, 'revcounter': 2, 'revcounter0': 1, 'first': False, 'last': False}

{'parentloop': {}, 'counter0': 2, 'counter': 3, 'revcounter': 1, 'revcounter0': 0, 'first': False, 'last': True}
  • first
    • 标识 for 循环是否是第一次
  • last
    • 标识 for 循环是否是以后一次
  • counter0
    • 类似索引
  • counter
    • 计数
  • 取值

(1)if+forloop

{% for re in d %}
    {% if forloop.first %}
        <p>第一次循环</p>
    {% elif  forloop.last %}
        <p>最后一次循环</p>
    {% else %}
        <p>{{ re }}</p>
    {% endif %}
{% empty %}
    <p>for循环的对象是空,不支持for循环</p>

{% endfor %}

(7)自定义过滤器、标签、inclusion_tag

(1)自定义过滤器

  • 在应用下创建一个名字必须叫templatetags文件夹
  • 在该文件夹内创建任意名字的py文件 eg:mytag.py
  • 在该py文件内必须书写下面两句话
from django import template

register = template.Library()
  • 在templatetags下面的py文件:
from django import template

register = template.Library()


@register.filter(name='heart')
def mysum(v1, v2):
    return v1 + v2
  • 后端
def test2(request):
    float = 11.11
    return render(request,'mubanyufa.html', locals())
  • 前端
{% load mytag %}
<p>{{ float|heart:666 }}</p>

(2)自定义标签

  • 在templatetags下面的py文件:
from django import template

register = template.Library()


@register.simple_tag(name='plus')
def index(a,b,c,d):
    return '%s-%s-%s-%s'% (a,b,c,d)
  • 前端
  • 标签多个参数彼此之间空格隔开
<p>{% plus 'heart' 123 123 456 %}</p>

(3)自定义inclusion_tag

  • 先定义一个方法,在页面上调用该方法,并且可以传值,该方法会生成一些数据然后传递给一个html页面,之后将渲染好的结果放到调用的位置

  • 当html页面某一个地方的页面需要传参数才能够动态的渲染出来,并且在多个页面上都需要使用到该局部,那么就考虑将该局部页面做成inclusion_tag形式

  • 在templatetags下面的py文件:

from django import template

register = template.Library()

@register.inclusion_tag('left_menu.html')
def left(n):
    data = [f'第{i}项' for i in range(n)]
    return locals()
  • 前端
  • 标签多个参数彼此之间空格隔开
{% left 10 %}
  • left_menu.html
<ul>
    {% for foo in data %}
    <li>{{ foo }}</li>
    {% endfor %}
</ul>

image

(8)模版继承

  • 可以被修改的区域有:

    1. css区域
    2. html区域
    3. js区域
  • 页面整体大差不差,只是某一些局部在做变化,使用模版继承很方便

  • home.html:

<!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">
  <title>Title</title>
  {% block page-css %}
  
  {% endblock %}
</head>
<body>
{% block content %}
	模板内容
{% endblock %}
</body>
</html>

(1)继承模版

  • 在子页面中在页面最上方使用下面的语法来继承母板
{% extends 'home.html' %}
  • 修改模板就在子页面中定义母版的block名来对应替换相应的内容
{% block content %}
  <p>123</p>
  <p>456</p>
  <p>789</p>
{% endblock %}

(2)模板的导入

{% include 'test.html' %} 

(9)静态模版加载

(1)

  • 加载Django的静态文件
{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />
  • 引用JS文件时使用:
{% load static %}
<script src="{% static "mytest.js" %}"></script>
  • 某个文件多处被用到可以存为一个变量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

(10)导出项目模块版本

pip freeze > requirement.txt
  • 安装
pip install -r requirement.txt
posted @ 2024-03-11 21:30  ssrheart  阅读(53)  评论(0编辑  收藏  举报