Jinja2のテンプレートフィルターリファレンスとカスタマイズ

1つ、jinja2テンプレートフィルター

  • フィルタはパイプ記号(|)を介して使用されます。例:{ {name | length}}、名前の長さが返されます。フィルタは、現在の変数をフィルタに渡す関数と同等であり、フィルタはそれ自体の関数に従って対応する値を返し、結果をページにレンダリングします。Jinja2には多くのフィルターが組み込まれています。ここですべてのフィルターを確認できます。

1. abs(value):数値の絶対値を返します。

2. default(value、default_value、boolean = false):現在の変数に値がない場合、代わりにパラメーターの値が使用されます。

name | default( 'juran')-名前が存在しない場合は、代わりにjuranが使用されます。boolean = Falseのデフォルトでは、変数が未定義の場合にのみデフォルトの値を使用します。Pythonを使用してfalseかどうかを判断する場合は、boolean = trueを渡すことができます。またはを使用して置き換えることもできます。

3.エスケープ(値)またはe:エスケープ文字。<、>などの記号をHTMLの記号にエスケープします。

例:content | escapeまたはcontent | e。

4. first(value):シーケンスの最初の要素を返します。

例:names | first。

5. format(value、* arags、** kwargs):フォーマット文字列。

たとえば、次のコード:{ {"%s"-"%s" | format( 'Hello?'、 "Foo!")}}は次のように出力します:Helloo?-Foo!

6. last(value):シーケンスの最後の要素を返します。

例:names | last。

7. length(value):シーケンスまたはディクショナリの長さを返します。

例:names | length。

8. join(value、d = u ''):シーケンスをパラメーターdの値で文字列に連結します。

9. safe(value):グローバルエスケープがオンになっている場合、セーフフィルターは変数のエスケープをオフにします。

例:content_html | safe。

10. int(value):値をint型に変換します。

11. Float(value):値をfloat型に変換します。

12. lower(value):文字列を小文字に変換します。

13. upper(value):文字列を小文字に変換します。

14. replace(value、old、new):oldをnewに置き換える文字列を置き換えます。

15. truncate(value、length = 255、killwords = False):長さの長さの文字列をインターセプトします。

16. striptags(value):文字列内のすべてのHTMLタグを削除します。複数のスペースが表示される場合、それらは1つのスペースに置き換えられます。

17.トリム:文字列の前後の空白文字をインターセプトします。

18. string(value):変数を文字列に変換します。

19. wordcount(s):長い文字列の単語数を数えます。

2、カスタムフィルター

1.フィルター定義:

@ app.template_filter( "filter name")
defフィルター名(パラメーター)
によって実装される関数

2.フィルターの参照:

  • システムフィルター参照方法と同じですが、
    • { {変数名|フィルター名}}
    • { {変数名|フィルター名(パラメーター)}}

3つの例

1.コード:

from flask import Flask,render_template
from datetime import datetime

app=Flask(__name__)

@app.route('/')
def index():
    context = {
    
    
        'username': 'hello 老萝卜',
        'age': -18,
        'home': '湖北',
        'recommend': 'chinapost',    # 删除后,应显示缺省值
        'es': "<script>alert('hello    everyone');</script>",
        'books': ['Python', 'Java', 'PHP'],
        'book': {
    
    'Python': 666},
        'address': '中国   湖北省   武汉市      东西湖区',
        'now_time': datetime(2020, 10, 14, 21, 7, 0)
    }
    return render_template('demo_jinja2filter.html', **context)   # 引用模板

# 自定义过滤器
@app.template_filter('my_filter')
def my_filter(value):
    return value.replace('hello', '')

@app.template_filter('handler_time')
def handler_time(time):
    """
    小于一分钟---->刚刚
    大于一分钟小于一小时---->xxx分钟之前
    大于一小时小于24小时----> xxx小时之前
    """
    now = datetime.now()
    # 获取总秒数
    timestamp = (now - time).total_seconds()

    if isinstance(time, datetime):
        if timestamp < 60:
            return '刚刚'
        elif 60 <= timestamp <= 60*60:
            return '%s分钟之前' % int(timestamp/60)
        elif 60*60 < timestamp <= 60*60*24:
            return '%s小时之前' % int(timestamp/(60*60))
    else:
        return time


if __name__=="__main__":
    app.run(debug=True)

2.テンプレート

テンプレートは通常./templatesディレクトリに配置されます。ディレクトリを何気なく変更しないことをお勧めします

#./templates/demo_jinja2filter.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Jinja2过滤器演示</title>
</head>
<body>
    <h1>首页</h1>
    用户姓名:{
    
    {
    
     username }}
    <p>年龄: {
    
    {
    
     age|abs }} (原值:{
    
    {
    
    age}}</p>
    <p>{
    
    {
    
     name|default('这个人很懒,什么都没有留下') }}</p>
    {
    
    % autoescape off %}
     <p>{
    
    {
    
     es }}</p>
    {
    
    % endautoescape %}
    <p>{
    
    {
    
     es|safe }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的第一个元素:{
    
    {
    
     books|first }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的最后一个元素:{
    
    {
    
     books|last }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的长度:{
    
    {
    
     books|length }}</p>
    <p>返回一个字典{
    
    {
    
    book}}的长度:{
    
    {
    
     book|length }}</p>
    <p>返回一个序列{
    
    {
    
    books}}的第一个元素长度:{
    
    {
    
     books|first|length }}</p>
    <p>字符串{
    
    {
    
    username}}替换"replace('萝卜', 'luobo')"{
    
    {
    
     username|replace('萝卜', 'luobo') }}</p>
    <p>字符串{
    
    {
    
    username}}截取:{
    
    {
    
     username|truncate(length=5) }}</p>
    <p>删除字符串"{
    
    {es}}"中所有的HTML标签,如果出现多个空格,将替换成一个空格:{
    
    {
    
     es|striptags }}</p>
    <p>计算一个长字符串"{
    
    {address}}"中单词的个数:{
    
    {
    
     address|wordcount }}</p>
    <p>{
    
    {
    
     username|my_filter }}</p>
    <p>博客发表时间:{
    
    {
    
     now_time|handler_time }}</p>
</body>
</html>

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/laoluobo76/article/details/109095318