日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

模板层(模板语法)

發布時間:2025/3/16 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模板层(模板语法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

模板層

  標簽

  過濾器

  自定義標簽 過濾器 inclusion_tag

  模板的繼承

  模板的導入

#后期向前端頁面傳遞數據的方式 #第一種 return render(request,'index.html',{'n':n}) #第二種 return render(request,'index.html',locals()) #將當前所在的名稱空間中的名字全部傳遞給前端頁面

?

模板層中支持的寫法

{# 取l中的第一個參數 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取對象的name屬性 #} {{ person_list.0.name }} {# .操作只能調用不帶參數的方法 #} {{ person_list.0.dream }}

只需要記兩種特殊符號:

{{? }}和?{% %}

變量相關的用{{}},邏輯相關的用{%%}

?

?

后端

from django.shortcuts import render# Create your views here.def index(request):n=6969s='你好 技術類的 束帶結發了 jsddsfjl sdjfl1'# l = ['a', 'b', 'c','d','e','f','g']l = []d = {'name':'jason','password':'22','hobby':['看書','學習','琴棋書畫']}t = ('觀摩','邪魔','容嬤嬤')st ={'python','java','php','golang'}# flag = 123flag = Nonedef func():return '你找我干啥?'class Demo(object):def __init__(self,name):self.name = namedef func(self):return self.name@classmethoddef index(cls):return 'cls'@staticmethoddef bar(name,age):return 'bar'def __str__(self):return '大帥比'obj = Demo('jason')print(obj) #<app01.views.index.<locals>.Demo object at 0x00000000042F7908> file_size = 231334from datetime import datetimectime = datetime.now()res = 'hello big ba by baj na jam lj'ht = '<h1>我是h1標簽</h1>'sr = '<script>alert(123)</script>'from django.utils.safestring import mark_safexxx = mark_safe('<h1>我是安全的h1</h1>')return render(request,'index.html',locals()) #將當前所在的名稱空間中的名字全部傳遞給前端頁面

?

前端

<p>{{ n }}</p> <p>{{ s }}</p><p>{{ d }}</p> <p>{{ d.hobby.2 }}</p> <p>{{ t }}</p> <p>{{ t.2 }}</p> <p>{{ st }}</p> <!--集合無序--> <p>{{ flag }}</p> <p>{{ func }}</p> <!--無參函數 會自動加括號調用 --><p>{{ obj }}</p> <!--<app01.views.index.<locals>.Demo object at 0x0000000004309E10>--> <p>{{ obj.name }}</p> <p>{{ obj.func }}</p> <p>{{ obj.bar }}</p> <!--不支持傳參--> <p>{{ obj.index }}</p> <!--類方法綁定給類 不需要手動傳入參數-->{#過濾器#} {#調用python自帶的內置方法,可以調用不需要傳參的一些內置方法#} <!--我是原生的html注釋--> #這里的注釋可以在前端頁面檢查看到 <p>前端統計字符串長度{{ s|length }}</p> {#前端統計字符串長度30#}<p>前端獲取數據如果是空就返回default后面默認的數值》》》》{{ flag|default:'flag沒有值' }}</p> {#前端獲取數據如果是空就返回default后面默認的數值》》》》flag沒有值#}<p>把數字按照數據轉換進制進行轉換表示文件大小的單位:{{ file_size|filesizeformat }}</p> {#把數字按照 數據轉換進制 進行轉換表示文件大小的單位:225.9 KB#} <p>{{ ctime }}</p> {#June 11, 2019, 3:15 p.m.#}<p>格式化時間(不要加百分號){{ ctime|date:'Y-m-d' }}</p> {#格式化時間(不要加百分號)2019-06-11#} <p>字符串的切片操作:{{ res|slice:'0:8' }}</p> {#hello bi#}<p>{{ res|slice:'0:8:2' }}</p> {#hlob#} <p>截取固定的長度的字符串 四個點也算:{{ s|truncatechars:10 }}</p> {#截取固定的長度的字符串 三個點也算:你好 技術類...#}<p>按照空格截取文本內容:{{ res|truncatewords:4 }}</p> {#按照空格截取文本內容:hello big ba by ...#}<p>{{ s|truncatewords:4 }}</p> {#你好 技術類的 束帶結發了 jsddsfjl ...#}<p>{{ 'hhha'|add:'hehheheh' }}</p> {#hhhahehheheh#}


{#重點#}
<p>{{ ht }}</p>
{#<h1>我是h1標簽</h1>#}
<p>{{ sr }}</p>
{#<script>alert(123)</script>#}
<p>{{ ht|safe }}</p>
{#前端可以識別#}
<p>{{ sr|safe }}</p>
{#告訴前端是安全的前端可以識別腳本語法#}
<p>{{ xxx }}</p>
{#后端處理好已經是安全的再去發給前端#}



{#標簽#}
{% for foo in l %}
{# <p>{{ foo }}</p>#}
{# <p>{{ forloop.counter }}</p>#}  for循環次數從1 開始計數
{# <p>{{ forloop.counter0 }}</p>#}  for循環次數從0開始計數
{% if forloop.first %}
  <p>這是第一次</p>
{% elif forloop.last %}
  <p>這是最后一次</p>
{% else %}
  <p>{{ foo }}</p>
{% endif %}
{% empty %}
  <p>你給我的容器是個空的啊!這怎么玩?</p>
{% endfor %}

{% if flag %}
<p>flag不為空</p>
{% else %}
<p>flag竟然是空的 臥槽</p>
{% endif %}



{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}

{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}

{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %}

{{ d.keys }}
{{ d.values }}
{{ d.items }}
{{ d.hobby.2 }}

{% with d.hobby.2 as h %} #這個是當你這個值用到的很多次的時候可以起別名 但是這個別名只能在with里面使用 原來的方式點語法依然可以使用
{{ h }}
{{ d.hobby.2 }}
{% endwith %} ?總結: 后端傳函數名到前端,會自動加括號調用,但是不支持傳參
    后端傳對象到前端,就相當于打印了這個對象
    前端獲取后端傳過來的容器類型的內部元素,統一采用句點符號(.)
      <p>{{ d.hobby.2 }}</p> 數字對應的就是數據的索引
    前端能夠調用python后端數據類型的一些不需要傳參的內置方法
  模板語法的注意:
    不會展示到前端的頁面:{#調用python自帶的內置方法,可以調用不需要傳參的一些內置方法#}
  原生html的注釋
    會展示到前端:<!--我是原生的html注釋-->

?

?前后端取消轉義(*****) 腳本語法 js語法 都能識別

#前端|safe#后端 from django.utils.safestring import mark_safe xxx= mark_safe('<h1>我是h1標簽</h1>')

?

?標簽

for循環{%for foo in l %}<P>{{ foo }}</P><p>{{ forloop }}</p>{% endfor %} if 判斷{% if flag %}<p>flag不為空</p>{% else %}<p>flag是空</p>{% endif %}嵌套使用{% for foo in l %}{% if forloop.first %}<p>這是我的第一次</p>{% elif forloop.last %}<p>這是最后一次了啊</p>{% else %}<p>嗨起來!!!</p>{% endif %}{% endfor %}empty當你的for循環對象為空的時候會自動走empty代碼塊的內容后端:l = None前端:{% for foo in l %}{% if forloop.first %}<p>這是我的第一次</p>{% elif forloop.last %}<p>這是最后一次了啊</p>{% else %}<p>嗨起來!!!</p>{% endif %}{% empty %}<p>你給我的容器類型是個空啊,沒法for循環</p>{% endfor %}

?filters過濾器

在Django的模板語言中,通過使用?過濾器?來改變變量的顯示。

過濾器的語法: {{ value|filter_name:參數 }}

使用管道符"|"來應用過濾器。

例如:{{ name|lower }}會將name變量應用lower過濾器之后再顯示它的值。lower在這里的作用是將文本全都變成小寫。

注意事項:

  • 過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。
  • 過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。
  • 過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:', ' }}
  • '|'左右沒有空格沒有空格沒有空格
  • ?

    Django的模板語言中提供了大約六十個內置過濾器。

    default

    如果一個變量是false或者為空,使用給定的默認值。 否則,使用變量的值。

    {{ value|default:"nothing"}}

    如果value沒有傳值或者值為空的話就顯示nothing

    length

    返回值的長度,作用于字符串和列表。

    {{ value|length }}

    返回value的長度,如 value=['a',?'b',?'c',?'d']的話,就顯示4.

    filesizeformat

    將值格式化為一個 “人類可讀的” 文件尺寸 (例如?'13 KB',?'4.1 MB',?'102 bytes', 等等)。例如:

    {{ value|filesizeformat }}

    如果 value 是 123456789,輸出將會是 117.7 MB。

    slice

    切片

    {{value|slice:"2:-1"}}

    date

    格式化

    {{ value|date:"Y-m-d H:i:s"}}

    ?可用的參數:

    格式化字符描述示例輸出
    a'a.m.'或'p.m.'(請注意,這與PHP的輸出略有不同,因為這包括符合Associated Press風格的期間)'a.m.'
    A'AM'或'PM'。'AM'
    b月,文字,3個字母,小寫。'jan'
    B未實現。?
    cISO 8601格式。?(注意:與其他格式化程序不同,例如“Z”,“O”或“r”,如果值為naive datetime,則“c”格式化程序不會添加時區偏移量(請參閱datetime.tzinfo) 。2008-01-02T10:30:00.000123+02:00或2008-01-02T10:30:00.000123如果datetime是天真的
    d月的日子,帶前導零的2位數字。'01'到'31'
    D一周中的文字,3個字母。“星期五”
    e時區名稱?可能是任何格式,或者可能返回一個空字符串,具體取決于datetime。''、'GMT'、'-500'、'US/Eastern'等
    E月份,特定地區的替代表示通常用于長日期表示。'listopada'(對于波蘭語區域,而不是'Listopad')
    f時間,在12小時的小時和分鐘內,如果它們為零,則分鐘停留。?專有擴展。'1','1:30'
    F月,文,長。'一月'
    g小時,12小時格式,無前導零。'1'到'12'
    G小時,24小時格式,無前導零。'0'到'23'
    h小時,12小時格式。'01'到'12'
    H小時,24小時格式。'00'到'23'
    i分鐘。'00'到'59'
    I夏令時間,無論是否生效。'1'或'0'
    j沒有前導零的月份的日子。'1'到'31'
    l星期幾,文字長。'星期五'
    L布爾值是否是一個閏年。True或False
    m月,2位數字帶前導零。'01'到'12'
    M月,文字,3個字母。“揚”
    n月無前導零。'1'到'12'
    N美聯社風格的月份縮寫。?專有擴展。'Jan.','Feb.','March','May'
    oISO-8601周編號,對應于使用閏年的ISO-8601周數(W)。對于更常見的年份格式,請參見Y。'1999年'
    O與格林威治時間的差異在幾小時內。'+0200'
    P時間為12小時,分鐘和'a.m。'/'p.m。',如果為零,分鐘停留,特殊情況下的字符串“午夜”和“中午”。?專有擴展。'1?am''1:30?pm'?/ t3>,'midnight''noon''12:30pm'?/ T10>
    rRFC 5322格式化日期。'Thu,?21?Dec?2000?16:01:07?+0200'
    s秒,帶前導零的2位數字。'00'到'59'
    S一個月的英文序數后綴,2個字符。'st','nd','rd'或'th'
    t給定月份的天數。28?to?31
    T本機的時區。'EST','MDT'
    u微秒。000000?to?999999
    U自Unix Epoch以來的二分之一(1970年1月1日00:00:00 UTC)。?
    w星期幾,數字無前導零。'0'(星期日)至'6'(星期六)
    WISO-8601周數,周數從星期一開始。1,53
    y年份,2位數字。'99'
    Y年,4位數。'1999年'
    z一年中的日子0到365
    Z時區偏移量,單位為秒。?UTC以西時區的偏移量總是為負數,對于UTC以東時,它們總是為正。-43200到43200

    ?

    safe

    Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,后臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似于FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。

    比如:

    value = "<a href='#'>點我</a>"

    {{ value|safe}}

    truncatechars

    如果字符串字符多于指定的字符數量,那么會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。

    參數:截斷的字符數

    {{ value|truncatechars:9}}

    truncatewords

    在一定數量的字后截斷字符串。 按照空格切分

    {{ value|truncatewords:9}}

    cut

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

    {{ value|cut:' ' }}

    如果value為'i love you',那么將輸出'iloveyou'.

    join

    使用字符串連接列表,例如Python的str.join(list)

    timesince

    將日期格式設為自該日期起的時間(例如,“4天,6小時”)。

    采用一個可選參數,它是一個包含用作比較點的日期的變量(不帶參數,比較點為現在)。 例如,如果blog_date是表示2006年6月1日午夜的日期實例,并且comment_date是2006年6月1日08:00的日期實例,則以下將返回“8小時”:

    {{ blog_date|timesince:comment_date }}

    分鐘是所使用的最小單位,對于相對于比較點的未來的任何日期,將返回“0分鐘”。

    timeuntil

    似于timesince,除了它測量從現在開始直到給定日期或日期時間的時間。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期實例,則{{ conference_date | timeuntil }}將返回“4周”。

    使用可選參數,它是一個包含用作比較點的日期(而不是現在)的變量。 如果from_date包含2006年6月22日,則以下內容將返回“1周”:

    {{ conference_date|timeuntil:from_date }}

    ?

    ?

    ?

    自定義過濾器必須做的三件事:

    #1 在應用名下新建一個名為tmplatetags文件夾(必須叫這個名字) #2 在該新建的文件夾內新建一個任意名稱的py文件 #3 在該py文件中需要固定寫下面兩句代碼from django import template register = template.Library()#自定過濾器 @register.filter(name='XBB') def index(a,b):return a+b #自定義標簽 @register.simple_tag def plus(a,b,c):return a+b+c#自定義inclusion_tag @register.inclusion_tag('login.html',name='login') def login(n):l = ['第%s項'%i for i in range(n)]return {'l':l}#login.html <ul>{% for foo in l %}<li>{{ foo}} </li>{% endfor %} </ul> #調用 #是將自定義的inclusion_tag 返回給它的括號內指定的小頁面 在頁面渲染好之后 是把這個渲染好的頁面返回給調用頁面的地方 {% login 5 %}

    #注意:要想使用自定義的過濾器 標簽 inclusion_tag 必須現在需要使用的html頁面加載你的py文件
    {% load my_tag%} #這個my_tag就是你tmplatetags文件夾下的py文件
    {{ 666|XBB:8}} #過濾器
    {% plus 1 2 3 %} #標簽
    {% login 5 %}  #inclusion_tag

    ?

    for循環

    普通for循環

    <ul> {% for user in user_list %}<li>{{ user.name }}</li> {% endfor %} </ul>

    for循環可用的一些參數:

    ?

    VariableDescription
    forloop.counter當前循環的索引值(從1開始)
    forloop.counter0當前循環的索引值(從0開始)
    forloop.revcounter當前循環的倒序索引值(從1開始)
    forloop.revcounter0當前循環的倒序索引值(從0開始)
    forloop.first當前循環是不是第一次循環(布爾值)
    forloop.last當前循環是不是最后一次循環(布爾值)
    forloop.parentloop本層循環的外層循環

    for ... empty

    <ul> {% for user in user_list %}<li>{{ user.name }}</li> {% empty %}<li>空空如也</li> {% endfor %} </ul>

    if判斷

    if,elif和else

    {% if user_list %}用戶人數:{{ user_list|length }} {% elif black_list %}黑名單數:{{ black_list|length }} {% else %}沒有用戶 {% endif %}

    當然也可以只有if和else

    {% if user_list|length > 5 %}七座豪華SUV {% else %}黃包車 {% endif %}

    if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

    with

    定義一個中間變量,多用于給一個復雜的變量起別名。  起的名字只能在with 里面用 原始的變量依然可以使用

    注意等號左右不要加空格。

    {% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }} {% endwith %}

    {% with business.employees.count as total %}{{ total }} employee{{ total|pluralize }} {% endwith %}

    ?

    csrf_token

    這個標簽用于跨站請求偽造保護。

    在頁面的form表單里面寫上{% csrf_token %}

    注釋

    {# ... #}

    注意事項

    1. Django的模板語言不支持連續判斷,即不支持以下寫法:

    {% if a > b > c %} ... {% endif %}

    ?

    2. Django的模板語言中屬性的優先級大于方法

    def xx(request):d = {"a": 1, "b": 2, "c": 3, "items": "100"}return render(request, "xx.html", {"data": d})

    如上,我們在使用render方法渲染一個頁面的時候,傳的字典d有一個key是items并且還有默認的 d.items() 方法,此時在模板語言中:

    {{ data.items }}

    默認會取d的items key的值。

    ?

    模板的繼承與導入

    #首先需要再被繼承的模塊中劃分多個區域 {% block 給區域起的名字 %}{% endblock %}#通常情況下一個模板中應該至少有三塊 {% block css %} 頁面css代碼塊 {% endblock %}{% block js %} 頁面js代碼塊 {% endblock %}{% block contet %} #注意起的名字不加引號頁面主題內容 {% endblock %}

    ?

    子板繼承模板

    #先繼承模板所有的內容 {% extends 'home.html' %}#然后根據block塊的名字修改指定區域的內容 {% block content %}<form action=""><p>username:<input type="text" class="form-control"></p><p>password:<input type="text" class="form-control"></p></form> {% endblock %}

    ?

    模板的導入:將一段html當做模塊的方式導入另一個html展示

    {% include '想導入的html文件名' %}

    ?

    靜態文件相關

    ?

    {% static %}

    {% load static %} <img src="{% static "images/hi.jpg" %}" alt="Hi!" />

    引用JS文件時使用:

    {% load static %} <script src="{% static "mytest.js" %}"></script>

    某個文件多處被用到可以存為一個變量

    {% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>

    {% get_static_prefix %}

    {% load static %} <img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

    或者

    {% load static %} {% get_static_prefix as STATIC_PREFIX %}<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /> <img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

    ?

    ?

    靜態文件配置

    {% load static %} <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一種方式<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二種方式

    ?

    轉載于:https://www.cnblogs.com/lakei/p/11006285.html

    總結

    以上是生活随笔為你收集整理的模板层(模板语法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。