Flask 的 template模板 與 jinja2語法


Flask 的 template模板 與 jinja2語法

    Flask使用的是Jinja2模板,所以其語法和Django基本無差別

>## 1、模板基本數據的渲染
變量 {{..}}
列表 {% for item in List %}<li>{{item}}</li>{% endfor %}
字典 {% for k,v in Dict.items() %}<li>{{k}}{{v}}</li>{% endfor %}

>## 2 注意:Markup等價django的mark_safe 用於返回有效的html標簽
    也可以像django一樣使用 {{data|safe}}

>## 3 像django的simple_tag, filter 一樣,傳遞自定義的函數
局部函數 -- 只能在傳入的template中使用,直接定義,傳遞

      def add_num(a,b):
	    return int(a) + int(b)

    返回時:
        return render_template('..html','add_num':add_num)

    使用:
        {{add_num(1,2)}}
  
全局  -- 全局使用

	django 的 filter可以當做if條件

	需要 @app.template_global()裝飾器   
		 def func(a,b,c)  --->>  全局temlate使用 {{func(a,b,c)}}

	  和 @app.template_filter()裝飾器
		 def func(a,b,c)  --->>  全局temlate使用 {{a|filter(b,c)}}  # 需要管道符

>## 4 模板繼承
{% extends 'layout.html' %}
{% block body %}
{% endblock %}

{% include 'asd.html' %}

>## 5 定義宏: 相當於定義函數來控制html的內容
 一般是用於多次會用到的地方,比如分頁

在需要重用的html中寫,paginator.html:

{% macro page(data,url) -%}

	{% if data %}
		<ul class="pagination pagination-sm no-margin">
		    <li><a href="{{ url_for(url,page=1) }}">首頁</a></li>

		    {% if data.has_prev %}
		    <li><a href="{{ url_for(url,page=data.prev_num) }}">上一頁</a></li>
		    {% else %}
		    <li class="disabled"><a href="">上一頁</a></li>
		    {% endif %}

		    {% for v in data.iter_pages() %}
		        {% if v == data.page %}
		        <li class="active"><a href="{{ url_for(url,page=v) }}">{{ v }}</a></li>
		        {% else %}
		        <li><a href="{{ url_for(url,page=v) }}">{{ v }}</a></li>
		        {% endif %}

		    {% endfor %}


		    {% if data.has_next %}
		    <li><a href="{{ url_for(url,page=data.next_num) }}">下一頁</a></li>
		    {% else %}
		    <li class="disabled"><a href="">下一頁</a></li>
		    {% endif %}
		    <li><a href="{{ url_for(url,page=data.pages) }}">尾頁</a></li>
		</ul>
	{% endif %}

{%- endmacro  %}	

調用:

{% import 'admin/paginator.html' as pg %}
{{ pg.page(page_data,'admin.tag_list') }}

例子:

視圖中:

from flask import Flask,redirect,Markup,render_template,make_response
app = Flask(__name__)

    # 全局使用
@app.template_filter()
def Filter(a,b,c):
	return min(a,b,c)

    # 全局使用
@app.template_global()
def Global(a,b,c):
	return a + b + c

    # 自定義函數 -- 局部
def add_num(a,b):
	return int(a) + int(b)

@app.route('/index',endpoint='index',methods=['GET'])
def index():

	Dict = {
	    'List':[1,2,3],
	    'Dict':{'amy':18,'bob':20},
	    'Str':'hello',
	    'add_num':add_num,
	    'tag':Markup('<a href="#">點擊</a>')  # 或者在templates中使用 |safe
	}

	response = make_response(render_template('index.html',**Dict))
	return response

if __name__ == '__main__':
	app.run()

html中:

<p>hello!</p>

<p>字符串:{{Str}}</p>

<ul>
列表:
	{% for item in List %}
	<li>
		{{item}}
	</li>
	{% endfor %}
字典:
	{% for k,v in Dict.items() %}
	<li>
		{{k}}{{v}}
	</li>
	{% endfor %}
</ul>

<p>自定義加法函數:{{add_num(1,4)}}</p>
<p>全局函數global:{{Global(1,4,5)}}</p>
<p>全局函數filter:{{1|Filter(1,4)}}</p>


html標簽:{{tag}}

輸出結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM