1. 程式人生 > >Django2.0-templates(3)-模版標籤

Django2.0-templates(3)-模版標籤

常用的模板標籤

  1. if標籤。需要{% %}包裹。可以使用==, !=, <, <=, >, >=, in, not in, is, is not等判斷運算子

    • 變數名直接寫,不用{{}}包裹,包裹的是要輸出的
  2. for...in...標籤。可以遍歷列表,元組,字串,字典等

    • 新增reversed可以翻轉順序
    • DTL中,執行一個方法不能使用圓括號的形式。遍歷字典的時候,如果需要items keys values方法,用dict.items這種方式獲得
    • for迴圈中,DTL提供了一些變數可供使用
      • forloop.counter: 當前迴圈的下標。以1作為起始值
      • forloop.counter0
        : 當前迴圈的下標。以0作為起始值
      • forloop.revcounter: 當前迴圈的方向下標值。預設1是最後的結束值
      • forloop.revcounter0: 當前迴圈的方向下標值。預設0是最後你結束值
      • forloop.first: 是否是第一次遍歷
      • forloop.last: 是否是最後一次遍歷
      • forloop.parentloop: 如果有多次迴圈巢狀,這個屬性代表的是上一級的for迴圈
    • for...in...沒有continue和break!!!!!!!!!!!!!
  3. for...in...empty標籤。 如果遍歷的物件沒有元素,會執行empty中的內容

    • if和for標籤

      def
      func(request): d = { "number": 100, "lists": [ 1, 2, "a", ], "dicts": { "index1": 111, "index2": 222, "index3": 333, }, "empty_dicts": { }, } return render(request,
      "index.html",context=d)
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
          <h1>
              {% if number > 50 %}
                  大於50
              {% endif %}
          </h1>
      
          <h1>
              {% for list in lists %}
                  {{ list }}
              {% endfor %}
              <br>
              {% for list in lists reversed %}
                  {{ list }}
              {% endfor %}
      
      
          </h1>
      
          <h2>
              {% for dict in dicts %}
                  {{ dict }}
              {% endfor %}
      
              <br>
              {% for value in dicts.values %}
                  當前的下標是 {{ forloop.counter }}
                  {{ value }}
                  <br>
              {% endfor %}
              <br>
          </h2>
          <h3>
                 {% for empty_dict in empty_dicts %}
                     {{ empty_dict }}
                 {% empty %}
                     nothing there
                 {% endfor %}
      
          </h3>
      </body>
      </html>
      

      執行

      run1

  4. with標籤。定義變數。有兩種使用方式

    # views.py
    d = {
        "person": [
          	"jack",
            "lee",
        ],
    }
    
    def func(request):
    	return render(request, "index.html", context=d)
    
    • one

      <!-- html -->
      {% with name=person.0 %}
      	{{ name }}
      {% endwith %}
      
    • two

      <!-- html -->
      {% with person.0 as name %}
      	{{ name }}
      {% endwith %}
      
    • 注意=前後不能有空格

    • 這個別名的作用域只在with語句塊內

      <!-- html -->
      {% with person.0 as name %}
      	{{ name }}
      	{{ name }}
      {% endwith %}
      	{{ name }} {# 這一句沒執行 #}
      
  5. url標籤。 類似reverse()函式。會用到對映時URL指定過的名字進行反轉

    <!-- html -->
    <a href="{% url 'book:list' %}"> 列表 </a>
    (# 這裡'book:list'是定義在app_name是book的名為list的URL#)
    {# url和'book:list'之間需要空格,也就是說空格是分隔符#}
    
    
    • 傳遞引數。和reverse()類似

      位置引數和關鍵字引數不可以同時用。

      # urls.py
      path("detail/<book_id>/", views.book_detail,name="detail")  # 這個url是帶引數的 
      
      # views.py
      def book_detail(request, book_id):
          next = request.GET.get("page")
          if next:
              return HttpResponse("book_id is {}, query_string is {}".format(book_id, next))
      
      <!-- html -->
      {# url反轉,使用位置引數 #}
      <a href="{% url 'book:detail’ 1 %}"> 頁面 </a> {# 位置引數根據URL的變數位置進行排列 #}
      
      {# url反轉, 使用關鍵字引數 #}
      <a href="(% url 'book:detail' book_id=1 %)"> 頁面 </a>
      

      如果想要傳遞查詢字串的引數,必須手動在後面新增

      <!-- html -->
      <a href = "{% url 'book:detal' book_id=1 %}?page=1"> 頁面 </a>
      

      如果要傳遞多個引數,那麼通過空格進行分割

      <!-- html -->
      <a href = {% url 'book:detail' book_id=1 page=2 %}> 頁面 </a>
      
  6. spaceless標籤。移除html標籤中的空白字元。包括空格、tab鍵,換行等。

    • 使用

      {% spaceless %}
      	<p>
          	<a href="index/">INDEX</a>    
      	</p>
      {% endspaceless %}
      
    • 渲染完畢後是以下格式

      <p><a href="index/">INDEX</a></p>
      
    • spaceless只會移除html標籤之間的空白字元。而不會移除標籤與文字之間的空白字元。

  7. autoescape標籤。自動轉義,會將哪些特殊字元進行轉義,比如會將<轉義成&lt;等。DTL預設開啟。不容易出現XSS漏洞。

    def url_page(request):
        d = dict{
            "baidu": "<a href = 'http://www.baidu.com'>百度</a>"
        }
    
    {% autoescape off %}
    	{{ baidu }}
    {% endautoescape %}
    
  8. verbatim標籤。預設在DTL模板中會去解析哪些特殊字元, 比如{%}%}{{}}等。如果在某個程式碼片段中不想使用這個解析引擎,比如使用了其他類似的模板時,可以把這個程式碼片段放在verbatim標籤中。

    {% verbatim %}
    	{{ name }}
    {% endverbatim %}}