中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Django中使用Jinja2模板引擎

發布時間:2021-03-24 15:36:24 來源:億速云 閱讀:229 作者:Leah 欄目:開發技術

如何在Django中使用Jinja2模板引擎?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Jinja2模板引擎

安裝Jinja2 :pip install jinja2,在應用目錄下添加jinja2_env.py設定環境變量。

from django.contrib.staticfiles.storage import staticfiles_storage
from django.urls import reverse

from jinja2 import Environment


def environment(**options):
  env = Environment(**options)
  env.globals.update({
    'static': staticfiles_storage.url,
    'url': reverse,
  })
  return env

并在管理目錄下setting.py中做出3項修改:

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 基本語法

  1. 控制結構{% %}

  2. 變量 {{ }}

  3. 注釋{# #}

例如:

{# jinja2 code #}
{% if {{ i }}> 10 %}
...
{% else %}
....
{% endif %}

Jinja2 變量

在模板中的{{ i }}結構表示變量,這是一種特殊的占位符,告訴模板引擎這個位置的值從渲染模板時使用的數據結構中獲取。jinja2支持python中所有的Python數據類型比如列表、字段、對象等

<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>

Jinja2變量過濾器

變量的值可以使用過濾器修改。過濾器在添加變量名后,二者以豎線分隔。如:

<p>Hello, {{ user|capitalize }}!</p>
過濾器名說明
safe渲染時值不轉義
capitialize把值的首字母轉換成大寫,其他子母轉換為小寫
lower把值轉換成小寫形式
upper把值轉換成大寫形式
title把值中每個單詞的首字母都轉換成大寫
trim把值的首尾空格去掉
striptags渲染之前把值中所有的HTML標簽都刪掉
join拼接多個值為字符串
replace替換字符串的值
round默認對數字進行四舍五入,也可以用參數進行控制
int把值轉換成整型

關于safe過濾器,默認情況下Jinja2出于安全考慮會轉義所有變量。當一個變量為<b>Hello</b>沒有添加safe過濾器時,顯示的結果為

如何在Django中使用Jinja2模板引擎

瀏覽器能顯示<b>元素,但不會解釋它。

當添加safe過濾器時,結果為

當需要顯示變量中存儲的HTML代碼時,可使用safe過濾器。

Jinjia2控制結構

Jinja2提供了多種控制結構,可用來改變模板的渲染流程。

條件判斷語句與Python類似,但其不需要使用冒號結尾,而結束控制語句,需要使用endif關鍵字:

{% if daxin.safe %}
 daxin is safe.
{% elif daxin.dead %}
 daxin is dead
{% else %}
 daxin is okay
{% endif %}

for循環實現一組元素的渲染:

<ul>
{% for user in users %}
 <li>{{ user.username|title }}</li>
{% endfor %}
</ul>

在jinja2中不存在while循環。

Jinja2 宏

宏類似Python代碼中的函數。如:

{% macro render_comment(comment) %}  
 <li>{{ comment }}</li>
{% endmacro %}
<ul>
 {% for comment in comments %}
 {{ render_comment(comment)}}
 {% endfor %}
</ul>

還可以將宏保存在單獨的文件中,然后在需要的時候導入:

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

Jinja 模板繼承

jinja2中最強大的部分就是模板繼承,這類似于python代碼的類繼承。首先創建名為base.html的基模板:

<!DOCTYPE html>
<html lang="en">
<head>
  <link rel="stylesheet" href={{ static('css/mystyle.css') }}>
  <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
  <div id="sidebar">
    {% block sidebar %}
    <ul>
      <li><a href="/" rel="external nofollow" >Home</a></li>
      <li><a href="/blog/" rel="external nofollow" >Blog</a></li>
    </ul>
    {% endblock %}
  </div>

  <div id="content">
    {% block content %}{% endblock %}
  </div>
</body>
</html>

基模板中定義的區塊可在衍生模板中覆蓋。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 %}
  <h3>{{ topic.id }}</h3>
  <p>{{ topic.text }}</p>
{% endfor %}
{% endblock %}

extends指令聲名這個模板衍生自base.html。在extends指令后,基模板的4個區塊被重新定義,模板引擎將其插入合適的位置。如果基模板和衍生模板的同名區塊有內容,衍生模板的內容會被顯示。在衍生模板區塊中調用super(),引用基模板的同名內容。topics.html里的head區塊引用了基模板的css文件。

關于如何在Django中使用Jinja2模板引擎問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万载县| 滦平县| 海盐县| 布拖县| 崇阳县| 赤峰市| 新河县| 潼南县| 兴山县| 青冈县| 独山县| 肇州县| 即墨市| 博湖县| 保德县| 五指山市| 云龙县| 垦利县| 得荣县| 上虞市| 西华县| 镇平县| 新密市| 龙岩市| 东阳市| 霍邱县| 巴彦县| 中西区| 巴中市| 武陟县| 定州市| 罗甸县| 苏尼特左旗| 东兴市| 石城县| 彰化市| 云浮市| 棋牌| 寿光市| 新营市| 平山县|