(更新时间)2021年4月11日 Django框架 Django使用jinja2模板
发布日期:2021-06-29 15:15:37 浏览次数:3 分类:技术文章

本文共 3700 字,大约阅读时间需要 12 分钟。

Django使用jinja2模板

jinja2介绍

Jinja2:是 Python 下一个被广泛应用的模板引擎,是由Python实现的模板语言,他的设计思想来源于 Django 的模板引擎,并扩展了其语法和一系列强大的功能,尤其是Flask框架内置的模板语言

由于django默认模板引擎功能不齐全,速度慢,所以我们也可以在Django中使用jinja2, jinja2宣称比django默认模板引擎快10-20倍。

Django主流的第三方APP基本上也都同时支持Django默认模板及jinja2,所以要用jinja2也不会有多少障碍。

安装jinja2模块

pip install jinja2

Django配置jinja2

  • 在项目文件中创建 jinja2_env.py 文件
from django.contrib.staticfiles.storage import staticfiles_storagefrom django.template.defaultfilters import datafrom django.urls import reversefrom jinja2 import Environmentdef environment(**options):  env = Environment(**options)  env.globals.update({
'static': staticfiles_storage.url, 'url': reverse,#替换默认url解析 'data':data #替换默认过滤器 }) return env
  • 在settings.py文件
TEMPLATES = [  {
'BACKEND': 'django.template.backends.jinja2.Jinja2', # 1 'DIRS': [os.path.join(BASE_DIR, 'templates'), os.path.join(BASE_DIR, 'learning_logs/templates')] # 2 , 'APP_DIRS': True, 'OPTIONS': {
'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], 'environment': 'learning_logs.jinja2_env.environment', # 3 }, },]

Jinja2语法

Jinja2的语法与template类似,对比template,它更加灵活、快速和安全。

Jinja2 基本语法

  • 控制结构{% %}
  • 变量 {
    { }}
  • 注释{# #}

例如:

#if 结构{
# jinja2 code #}{
% if daxin.safe %} daxin is safe.{
% elif daxin.dead %} daxin is dead{
% else %} daxin is okay{
% endif %}# for循环
    {
    % for user in users %}
  • {
    {
    user.username|title }}
  • {
    % endfor %}
#变量

this is a dicectory:{

{
mydict['key'] }}

this is a list:{

{
mylist[3] }}

this is a object:{

{
myobject.something() }}

# 过滤器

Hello, {

{
user|capitalize }}!

Jinja2自带过滤器

过滤器名 说明
safe 渲染时值不转义
capitialize 把值的首字母转换成大写,其他子母转换为小写
lower 把值转换成小写形式
upper 把值转换成大写形式
title 把值中每个单词的首字母都转换成大写
trim 把值的首尾空格去掉
striptags 渲染之前把值中所有的HTML标签都删掉
join 拼接多个值为字符串
replace 替换字符串的值
round 默认对数字进行四舍五入,也可以用参数进行控制
int 把值转换成整型

jinja2模板的使用循环索引

在这里插入图片描述

jinja2自定义过滤器

在jinja2_env.py文件中自定义过滤器

from jinja2 import Environmentdef environment(**options):    env = Environment(**options)    # 2.将自定义的过滤器添加到 环境中    env.filters['do_listreverse'] = do_listreverse    return env# 1.自定义过滤器def do_listreverse(li):    if li == "B":        return "哈哈"

使用如下

{
{
data(birthday,'Y年m月d日')}}{
{
do_listreverse('B')}}

Jinja2 宏

宏类似Python代码中的函数。如:

{
% macro render_comment(comment) %}
  • {
    {
    comment }}
  • {
    % endmacro %}
      {
      % for comment in comments %} {
      {
      render_comment(comment)}} {
      % endfor %}

    还可以将宏保存在单独的文件中,然后在需要的时候导入:

    {
    % import 'macro.html' as macros%}
      {
      % for comment in comments %} {
      {
      macros.render_comment(comment)}} {
      % endfor %}

    Jinja 模板继承

    jinja2中最强大的部分就是模板继承,这类似于python代码的类继承。首先创建名为base.html的基模板:

      
    {<div></div> % block title %}My amazing site{<div></div> % endblock %}
    {
    % block content %}{
    % endblock %}

    基模板中定义的区块可在衍生模板中覆盖。Jinja2使用block和endblock指令在基模板中定义内容区块。在上述基模板中定义了head、title、content和footer区块。

    新建一个topics.html的文件,继承基模板,用来显示全部的topics。

    {
    % extends "base.html" %}{
    % block title %}Topics{
    % endblock %}{
    % block head %} {
    {
    super() }}{
    % endblock %}{
    % block content %}{
    % for topic in topics %}

    {
    {
    topic.id }}

    {

    {
    topic.text }}

    {
    % endfor %}{
    % endblock %}

    extends指令声名这个模板衍生自base.html。在extends指令后,基模板的4个区块被重新定义,模板引擎将其插入合适的位置。如果基模板和衍生模板的同名区块有内容,衍生模板的内容会被显示。在衍生模板区块中调用super(),引用基模板的同名内容。topics.html里的head区块引用了基模板的css文件。

    转载地址:https://codeboy.blog.csdn.net/article/details/115599366 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

    上一篇:(更新时间)2021年4月11日 Django框架 CSRF攻击的处理
    下一篇:(更新时间)2021年4月10日 Django框架 中间件

    发表评论

    最新留言

    哈哈,博客排版真的漂亮呢~
    [***.90.31.176]2024年04月21日 01时36分25秒