Flask——模板的使用

codelife發表於2019-08-24

在控制器中引入模板類

from flask import render_template

向模板中傳入引數

return render_template("admin/demo.html", form = form)

模板檔案放在templates目錄對應的模組目錄下

模板繼承允許你構建一個包含你站點共同元素的基 本模板“骨架”,並定義子模板可以覆蓋的塊

基本模板

這個模板,我們會把它叫做 base.html ,定義了一個簡單的 HTML 骨架文件,你可 能使用一個簡單的兩欄頁面。用內容填充空的塊是子模板的工作:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">

<html  lang="en">

<html  xmlns="http://www.w3.org/1999/xhtml">

<head>

{% block head %}

<link rel="stylesheet" href="style.css" />

<title>{% block title %}{% endblock %} - My Webpage</title>

{% endblock %}

</head>

<body>

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

<div id="footer">

{% block footer %}

&copy; Copyright 2008 by <a href="http://domain.invalid/">you</a>.

{% endblock %}

</div>

</body>

在本例中, {% block %} 標籤定義了四個字幕版可以填充的塊。所有的 block 標籤 告訴模板引擎子模板可以覆蓋模板中的這些部分。

子模板

一個子模板看起來是這樣:

{% extends "base.html" %}

{% block title %}Index{% endblock %}

{% block head %}

{{ super() }}

<style type="text/css">

.important { color: #336699; }

</style>

{% endblock %}

{% block content %}

<h1>Index</h1>

<p class="important">

Welcome on my awesome homepage.

</p>

{% endblock %}

{% extend %} 標籤是這裡的關鍵。它告訴模板引擎這個模板“繼承”另一個模板。 當模板系統對這個模板求值時,首先定位父模板。 extends 標籤應該是模板中的第一個 標籤。

Super 塊

可以呼叫 super 來渲染父級塊的內容。這會返回父級塊的結果:

{% block sidebar %}

<h3>Table Of Contents</h3>

...

{{ super() }}

{% endblock %}

HTML 轉義

當從模板生成 HTML 時,始終有這樣的風險:變數包含影響已生成 HTML 的字元。

如果啟用了手動轉義,按需轉義變數就是 你的 責任。要轉義什麼?如果你有 一個 可能 包含 > 、 < 、 & 或 " 字元的變數,你必須轉義 它,除非變數中的 HTML 有可信的良好格式。轉義透過用管道傳遞到過濾器 |safe 來實現: {{ user.username|safe }} 。

For

遍歷序列中的每項。例如,要顯示一個由 users 變數提供的使用者列表:

<h1>Members</h1>

<ul>

{% for user in users %}

<li>{{ user.username|e }}</li>

{% endfor %}

</ul>

因為模板中的變數保留它們的物件屬性,可以迭代像 dict 的容器:

<dl>

{% for key, value in my_dict.iteritems() %}

<dt>{{ key|e }}</dt>

<dd>{{ value|e }}</dd>

{% endfor %}

</dl>

在一個 for 迴圈塊中可以訪問這些特殊的變數:

變數 描述
loop.index 當前迴圈迭代的次數(從 1 開始)
loop.index0 當前迴圈迭代的次數(從 0 開始)
loop.revindex 到迴圈結束需要迭代的次數(從 1 開始)
loop.revindex0 到迴圈結束需要迭代的次數(從 0 開始)
loop.first 如果是第一次迭代,為 True 。
loop.last 如果是最後一次迭代,為 True 。
loop.length 序列中的專案數。

如果因序列是空或者過濾移除了序列中的所有專案而沒有執行迴圈,你可以使用 else 渲染一個用於替換的塊:

<ul>

{% for user in users %}

<li>{{ user.username|e }}</li>

{% else %}

<li><em>no users found</em></li>

{% endfor %}

</ul>

可以在應用初始化檔案中自定義過濾器


def datetimeformat(value, format="%Y-%m-%d"):
    return value.strftime(format)
    app.jinja_env.filters['dateformat'] = datetimeformat

#可以在模板中直接呼叫
{{ dateformat() }}

當幾個模板中有公共部分時可以把公共部分程式碼拿出來單獨放入一個html檔案,

在需要使用的地方使用以下語法引入

{% include 'public_file.html' %}

jinja2完整文件

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章