Django 模版語法


一.簡介

模版是純文本文件。它可以產生任何基於文本的的格式(HTML,XML,CSV等等)。

模版包括在使用時會被值替換掉的 變量,和控制模版邏輯的 標簽

{% extends "base_generic.html" %}

{% block title %}{{ section.title }}{% endblock %}

{% block content %}
<h1>{{ section.title }}</h1>

{% for story in story_list %}
<h2>
  <a href="{{ story.get_absolute_url }}">
    {{ story.headline|upper }}
  </a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}

1.變量

{{ variable }}
{#如果后台 渲染傳過來的是字典格式的數據 那么前端頁面解析值 dict={"k1":"v1"} 假設傳的是{"dict": dict} 前端頁面取值 .字典key值#}
 
<h1>{{dict.k1}}</h1>

2.過濾器

  可以通過使用 過濾器來改變變量的顯示

格式:

{{ name|lower }}

過濾器參數;

{{ item.content |truncatewords:30 }}  <!-- 只顯示 content 變量的前30個詞 -->

default

{{ value|default:"nothing" }}   <!--如果一個變量是false或者為空,使用給定的默認值。否則,使用變量的值-->

length

返回值的長度。它對字符串和列表都起作用

{{ value|length }}

filesizeformat

將該數值格式化為一個 “人類可讀的” 文件容量大小 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)
{{ value|filesizeformat }}

add

把add后的參數加給value

{{ value|add:"2" }}  <!--如果 value 為 4,則會輸出 6.-->

capfirst

將變量首字母變大寫

{{ value|capfirst }}  <!--如果value是test過濾后轉為Test-->

cut

移除value中所有的與給出的變量相同的字符串

{{ value|cut:" " }}

dictsort

根據指定的key值對列表字典排序,並返回

{{ value|dictsort:"name" }}
{% for book in books|dictsort:"author.age" %}
    * {{ book.title }} ({{ book.author.name }})
{% endfor %}

如給定值為:

[
    {'title': '1984', 'author': {'name': 'George', 'age': 45}},
    {'title': 'Timequake', 'author': {'name': 'Kurt', 'age': 75}},
    {'title': 'Alice', 'author': {'name': 'Lewis', 'age': 33}},
]

那么結果為:

* Alice (Lewis)
* 1984 (George)
* Timequake (Kurt)

random

隨機返回一個值

{{ value|random }}
如果 value 是 列表 ['a', 'b', 'c', 'd'], 可能輸出的是 "b"

slice

切片

{{ some_list|slice:":2" }}

如果 some_list 是 ['a', 'b', 'c'], 輸出結果為 ['a', 'b']

 

truncatewords

字符串截斷

{{ value|truncatewords:2 }}

如果 value 是 "Joel is slug",輸出  "Joel is ...".

 

二.自動HTML轉義

默認情況下,Django 中的每個模板會自動轉義每個變量的輸出。明確地說,下面五個字符被轉義:

  • < 會轉換為&lt;
  • > 會轉換為&gt;
  • ' (單引號) 會轉換為&#39;
  • " (雙引號)會轉換為 &quot;
  • & 會轉換為 &amp;

如何關閉

要控制模板上的自動轉義,將模板(或者模板中的特定區域)包裹在autoescape標簽 中

{% autoescape off %}
    Hello {{ name }}
{% endautoescape %}

autoescape標簽接受on 或者 off作為它的參數。有時你可能想在自動轉義關閉的情況下強制使用它。下面是一個模板的示例:

Auto-escaping is on by default. Hello {{ name }}

{% autoescape off %}
    This will not be auto-escaped: {{ data }}.

    Nor this: {{ other_data }}
    {% autoescape on %}
        Auto-escaping applies again: {{ name }}
    {% endautoescape %}
{% endautoescape %}

自動轉義標簽作用於擴展了當前模板的模板,以及通過 include 標簽包含的模板,就像所有block標簽那樣。例如:

 

{% autoescape off %}
<h1>{% block title %}{% endblock %}</h1>
{% block content %}
{% endblock %}
{% endautoescape %}
{% extends "base.html" %}
{% block title %}This &amp; that{% endblock %}
{% block content %}{{ greeting }}{% endblock %}

三.自定義simple_tag

自定義simple_tag

 

{% load humanize %}

{{ 45000|intcomma }}

load標簽可以接受多個庫名稱,由空格分隔。例如

{% load humanize i18n %}

5.1 自定義標簽代碼

自定義模板標簽和過濾器必須位於Django 的某個應用中。如果它們與某個已存在的應用相關,那么將其與應用綁在一起才有意義;否則,就應該創建一個新的應用來包含它。

這個應用應該包含一個templatetags 目錄,和models.pyviews.py等文件處於同一級別目錄下,如果目錄不存在則創建它——不要忘記創建__init__.py 文件以使得該目錄可以作為Python 的包。在添加這個模塊以后,在模板里使用標簽或過濾器之前你將需要重啟服務器。新建 PY文件

切記:目錄名一定要是templatetags

自定義simple_tag
在templatetags目錄下的py文件中寫:
 
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django import template
from django.utils.safestring import mark_safe
 
register = template.Library()
 
@register.simple_tag
def my_simple_time(v1,v2,v3):
    return  v1 + v2 + v3

在HTML中寫:

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
{% my_simple_time 1 2 3%}
 
</body>
</html>

自定義simple_tag的html中不能用於if條件作為判斷,so引出了自定義過濾器函數

自定義過濾器函數

(最多倆個參數,html中可以有if條件語句)
自定義的過濾器就是一個帶1,2個參數的python函數,一個參數放變量值,一個用來放選項值,比如{{ var|remove:"bar" }}, var是變量值,"bar"是選項值。
在templatetags目錄下的py文件中寫:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from django import template
from django.utils.safestring import mark_safe
register = template.Library()
 
@register.filter
def detail3(value,arg):
    allcount, remainder = arg.split(',')
    allcount = int(allcount)
    remainder = int(remainder)
    if value%allcount == remainder:
        return True
    return False

在HTML中寫:

{% load xx %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
 
{{  23|detail4:"4,0" }}
 
{% if  23|detail4:"4,0" %}
<h1>123</h1>
{% endif %}
 
</body>
</html>

 


免責聲明!

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



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