模板

模板基本用法

  • 模板语法

    Jinja2中常见的三种定界符:

    a) 语句: 比如if判断、for循环

      {% .. %}
    

    b) 表达式: 比如字符串、变量、函数调用

      {{ ... }}
    

    c) 注释

      {{# ... #}}
    

    Jinja2支持使用"."获取变量的属性,比如user字典中的username键值通过user.username获取,效果等同于user[‘username’].

    Jinja2允许你在模板使用大部分python对象,比如字符串、列表、字典、元组等. 支持基本的运算符号(+、-、*、/ 等)、比较符号(==、!=)、逻辑符号(and、or、not)以及in、is、None和布尔值(True、False).

    常用的Jinja2 for循环特殊变量

    变量名说明
    loop.index当前迭代数(从1开始计数)
    loop.index0当前迭代数(从0开始计数)
    loop.revindex当前反向迭代数(从1开始计数)
    loop.revindex0当前反向迭代数(从0开始计数)
    loop.first如果是第一个元素,则为True
    loop.last如果是最后一个元素,则为True
    loop.previtem上一个迭代的条目
    loop.nextitem下一个迭代的条目
    loop.length序列包含的元素数量

模板辅助工具

  • 上下文

    模板上下文包含了很多变量,包括我们调用render_template()函数时手动传入的变量以及Flask默认传入的变量.
    除了渲染时传入变量,你也可以在模板中定义变量,使用set标签:

    {% set navigation = [('/', 'Home'), ('/about', 'About')] %}
    

    你也可以将一部分模板数据定义为变量,使用set和endset标签声明开始和结束:

    {% set navigation %}
    	<li><a href="/">Home</li>
    	<li><a href="/about">About</li>
    {% endset%}
    
    • 内置上下文

      全局可用,充当全局变量使用.
    变量说明
    config当前配置对象
    request当前请求对象,在已激活的请求环境下可用
    session当前的会话对象,在已激活的请求环境下可用
    g与请求绑定的全局变量,在已激活的请求环境下可用
    • 自定义上下文

      如果多个模板都需要使用同一个变量,可以设置一个模板全局变量. Flask提供了app.context_processor装饰器注册模板上下文处理函数,需要返回一个包含变量键值对的字典.
      @app.context_processor
      def inject_foo():
      	foo = 'I am foo.'
      	return dict(foo=foo)  # 等同于return {'foo': foo}
      
      当我们调用render_template()函数渲染任意一个模板时,所有使用app.context_processor装饰器注册的模板上下文处理函数(包括flask内置的上下文处理函数)都会被执行,这些函数的返回值会被添加到模板中,因此我们可以直接在模板中使用foo变量.
  • 全局对象

    • 内置全局函数

      常见的内置模板全局函数

    函数说明
    url_for生成URL的函数
    get_flashed_messages()获取flash消息的函数
    • 自定义全局函数

      @app.template_global()
      def bar():
      	return 'i am bar'
      
  • 过滤器

    在Jinja2中,过滤器用来修改和过滤变量值的特殊函数. 过滤器和变量用一个竖线隔开.

    比如:

    {{ name|title }}   # 将name标题化
    {{ movies|length }}  # 获取movie列表的长度
    {{ name|default('陌生人')|title}}  # 设置name默认值,并将其标题化
    

    另一种用法是将过滤器作用于一部分模板数据,使用filter标签和endfilter标签声明开始和结束.

    {% filter upper %}
    	This text becomes uppercase.
    {% endfilter %}
    
    • 内置过滤器

    在这里插入图片描述
    在这里插入图片描述

    • 自定义过滤器

    from  flask import Markup
    
    @app.template_filter()
    def musical(s):
    	return s + Markup(' &#9835')
    

    使用:

    {{ name|musical }}
    
  • 测试器

    Jinja2中,测试其用来测试变量或表达式,返回布尔值. 比如number测试器用来判断一个变量或表达式是否是数字,我们使用is连接变量和测试器:

    {% if age is number %}
    	{{ age * 35 }}
    {% else %}
    	无效的数字
    {% endif %}
    
    • 内置测试器

在这里插入图片描述

  • 自定义测试器

      @app.template_test()
      def baz(n):
      	if n == 'baz':
      		return True
      	return False
    
  • 模板环境对象

    模板环境中的全局函数、过滤器和测试器分别存储在Enviroment对象的globals、filters和tests属性中,这三个属性都是字典对象. 除了使用Flaski提供的装饰器和方法注册自定义函数,也可以直接操作这三个字典来添加对应的函数或变量.

    • 添加自定义全局对象

      和app.template_global()装饰器不同,直接操作globals字典允许我们传入任意Python对象,类似于上下文处理函数的作用.
      # 添加全局函数和全局变量
      def bar()
      	return 'I am bar'
      foo = 'I am foo'
      
      app.jinja_env_globals['bar'] = bar
      app.jinja_env_globals['foo'] = foo
      
    • 添加自定义过滤器

      def smiling(s):
      	return s + ';)'
      app.jinja_env.filters['smiling'] = smiling
      
    • 添加自定义测试器

      def baz(n):
      	if n == 'baz':
      		return True
      	return False
      
      app.jinja_env.tests['baz'] = baz
      

模板结构组使

  • 局部模板

    局部模板通常以include关键字插入,为了和普通模板区分,局部模板的命名一般以一个下划线开始.

    {% include '_banner.html' %}
    
  • 宏类似Python中的函数. 使用宏可以把一部分模板代码封装到宏里,使用传递的参数来构建内容,最后返回构建后的内容.

    为了便于管理,我们可以把宏存储在单独的文件中,这个文件通常命名为macros.html或_macors.html. 在创建宏时,使用macro和endmacro标签声明宏的开始和结束.

    {% macro qux(amount=1) %}
    	{% if amount == 1 %}
    		i am qux
    	{% elif amount > 1 %}
    		we are quxs
    	{% endif %}
    {% endmacro %}
    

    使用时需要使用import语句导入它,然后作为函数调用,传入必要的参数:

    {% from 'macros.html' import qux %}
    ...
    {{ qux(amount=5) }}
    
  • 模板继承

    {% extends ’base.html‘ %}
    {% from 'macros.html' import qux %}
    {% block content %}
    {% endblock %}
    

模板进阶实践

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,我无法找到关于Django运费模板的具体信息。但是,我可以为您提供一些关于Django模板的基本知识。 Django模板是一种用于生成动态网页的工具。它允许您将静态HTML与动态数据结合在一起,以便在网页上显示动态内容。在Django中,您可以使用模板来呈现数据,并将其与视图函数中的逻辑进行分离。 在Django中,您可以创建一个模板文件,其中包含HTML和模板语言。模板语言允许您在模板中插入动态数据、循环和条件语句等。您可以使用模板标签和过滤器来处理数据并进行逻辑操作。 要使用Django模板,您需要在视图函数中加载模板,并将数据传递给模板进行渲染。然后,您可以将渲染后的模板发送给客户端以显示在浏览器中。 以下是一个简单的示例,演示如何在Django中使用模板: 1. 创建一个模板文件(例如template.html),其中包含HTML和模板语言: ```html <!DOCTYPE html> <html> <head> <title>My Django Template</title> </head> <body> <h1>Welcome to {{ website_name }}</h1> <p>Today's date is {{ current_date }}</p> </body> </html> ``` 2. 在视图函数中加载模板并将数据传递给模板进行渲染: ```python from django.shortcuts import render from datetime import date def my_view(request): website_name = "My Website" current_date = date.today() return render(request, 'template.html', {'website_name': website_name, 'current_date': current_date}) ``` 3. 在urls.py中配置URL与视图函数的映射关系: ```python from django.urls import path from .views import my_view urlpatterns = [ path('my-view/', my_view, name='my-view'), ] ``` 通过访问`http://localhost:8000/my-view/`,您将看到渲染后的模板页面,其中包含动态数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值