flask基礎之jijia2模板語言進階(三)


前言

前面學習了jijia2模板語言的一些基礎知識,接下來繼續深挖jijia2語言的用法。

系列文章

控制語句

和python語言一樣,模板語言也有自己的控制語句,比如條件語句、循環語句等等;

條件語句if

{% if name and name == 'admin'  %}
    <h1>This is admin console</h1>
{% elif name %}
    <h1>Welcome {{ name }}!</h1>
{% else %}
    <h1>Please login</h1>
{% endif %}

循環語句for

# 基本的for循環結構
{% for user in users %}
  <li>{{ user.username|e }}</li>
{% endfor %}
# 當for循環沒有執行時使用else中代替
{% for user in users %}
    <li>{{ user.username|e }}</li>
{% else %}
    <li><em>no users found</em></li>
{% endfor %}

# 去除空白,加-,注意%和-必須緊靠,否則無效;
 {% for digit in digits -%}
    {{ digit }}
{%- endfor %}

注意:訪問每次循環中的數據使用loop變量代表本次的循環

{% for user in users %}
  <li>{{ user.username|e }}</li>
  {% if loop.index == 2 %}
    <p>OK</p>
  {% endif %}
{% endfor %}

loop.index	當前循環迭代的計數(從 1 開始)
loop.index0	當前循環迭代的次數(從 0 開始)
loop.revindex	到循環結束需要迭代的次數(從 1 開始)
loop.revindex0	到循環結束需要迭代的次數(從 0 開始)
loop.first	如果是第一次迭代,為 True 。
loop.last	如果是最后一次迭代,為 True 。
loop.length	序列中的元素的個數,即循環的長度;
loop.cycle	在一串序列間期取值的輔助函數。
loop.depth	當前循環在遞歸中的層級(從1開始)
loop.depth0	當前循環在遞歸中的層級(從0開始)

作用域控制with

# 限制對象的作用域,foo作為局部變量
{% with foo = 1 %}
    {% set bar = 2 %}
    {{ foo + bar }}
{% endwith %}

# do可以將表達式轉換語句,即表示執行的意思
{% with arr = ['Sunny'] %}
  {% do arr.append('Rainy') %} # 執行arr.append('Rainy')語句
  {{ arr }}
{% endwith %}

表達式

  • 算術表達式
# 其語法和python中的一模一樣
{{ a + b}}
  • 比較表達式
# 其語法和python中的一模一樣
{{ a == b}}
  • ~
{{ "Hello " ~ name ~ "!" }} 
返回(假設 name 值為 'John' ) Hello John! 

轉義

  • raw忽略模板的語法
# {{}} 和{%%}這種形式將失效,代表它們本身的符號
{% raw %}
    <ul>
    {% for item in items %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
{% endraw %}
  • 自動轉義
# autoescape參數,如果為false則關閉轉義,flask框架中默認為True
{% autoescape false %}
  <h1>Hello {{ name }}!</h1>
{% endautoescape %}

模板繼承

# test.html
# 父模板
{% block head %}

{% endblock %}

# 子模板
{% extends "test.html" %}
{% block head %}
{{ super() }}
Index
{% endblock %}
  • 想要渲染父模板中的模板需要使用{{ super() }},即如果父塊中已經有語句,不是空的,如果要保留就需要使用這個

注意:繼承之后,塊內是無法訪問塊外的變量的,如果想要訪問,則:

# scoped參數可以讓list塊內訪問塊外的變量
{% block list scoped %}{% endblock %}

包含include

include可以加載另一個模板在當前的位置,直接渲染;

# 直接在當前的位置
<body>
    {% include 'footer.html' %}
</body>
# 當”include”的模板文件不存在時,程序會拋出異常。可以加上”ignore missing”關鍵字,這樣如果模板不存在,就會忽略這段”{% include %}”語句。
 {% include 'footer.html' ignore missing %}
# 添加多個模板
 {% include ['footer.html','bottom.html','end.html'] ignore missing %}

  • 宏簡單來說就是在模板中定義並使用的函數,用來簡化代碼量

  • 定義一個宏

# 使用macro定義,相當於def
{% macro input(name, type='text', value='') -%}
    <input type="{{ type }}" name="{{ name }}" value="{{ value }}">
    
{%- endmacro %}
  • 調用一個宏
# 通過表達式調用
<p>{{ input('username', value='user') }}</p>
<p>{{ input('password', 'password') }}</p>

# 使用call,會將里面的內容替換func函數中的caller()方法
{% call func(users) %}
    <td><input name="delete" type="button" value="Delete"></td>
{% endcall %}
# 調用宏的參數,func函數中的caller(name)方法的參數name可以傳遞過來
{% call(name) func(users) %}
    <td><input name="delete" type="button" value="Delete"></td>
{% endcall %}

宏里面自動添加了varargs和kwargs參數,可以用來接收多余的變量或鍵值對參數;

  • 宏的導入:

一個宏可以被不同的模板使用,建議將其聲明在一個單獨的模板文件中。需要使用時導入進來即可,而導入的方法也非常類似於Python中的”import”。

{% import 'form.html' as form %}
<p>{{ form.input('username', value='user') }}</p>

參考:


免責聲明!

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



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