1. 程式人生 > >Django 模板層 靜態文件

Django 模板層 靜態文件

統計字符 strong 內容 ews 引擎 靜態方法 utf-8 ati 字典

模版語法重點:

  變量:{{ 變量名 }}

    1 深度查詢 用句點符

    2 過濾器

  標簽:{{% % }}

模板語法之變量

  在 Django 模板中遍歷復雜數據結構的關鍵是句點字符, 語法:{{變量名}}

index.html

{#模板語言註釋:前端看不到#}
{#相當於print了該變量#}
<h1>模板語言之變量</h1>
<p>字符串:{{ name }}</p>
<p>數字:{{ age }}</p>
<p>列表:{{ ll }}</p>
<p>元祖:{{ tu }}</
p> <p>字典:{{ dic }}</p> {#只寫函數名:相當於函數名(),執行該函數#} <p>函數:{{ test }}</p> {#對象內存地址#} <p>對象:{{ lqz }}</p> <p>列表套對象:{{ person_list }}</p> <p>字典套對象:{{ person_dic }}</p> {#深度取值#} <p>列表第0個值:{{ ll.0 }}</p> <p>列表第3個值:{{ ll.3 }}</p> <
p>字典取值:{{ dic.name }}</p> <p>字典取列表值:{{ dic.ll }}</p> {#再繼續取值,繼續點#} <p>對象取數據屬性:{{ lll.name }}</p> <p>對象取綁定給對象的函數屬性:{{ lll.get_name }}</p> <p>對象取綁定給類的函數屬性:{{ lll.cls_test }}</p> <p>對象取靜態方法:{{ lll.static_test }}</p> <p>把對象列表中egon年齡取出來:{{ person_list.1.age }}</
p> {#拓展:不能調有參數的方法#} <p>字符串的方法:{{ name.upper }}</p>

views.py

def index(request):
    name = lll
    age = 18
    ll = [1, 2, lll, egon]
    ll2=[]
    dic2={}
    tu = (1, 2, 3)
    dic = {name: lll, age: 18, ll: [1, 2, 4]}
    # 函數
    def test():
        print(lll)
        return zhouxiang dsb

    # 在模板上相當於執行該函數,並打印
    print(test())

    # 類和對象
    class Person():
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def get_name(self):
            return self.name
        @classmethod
        def cls_test(cls):
            return cls
        @staticmethod
        def static_test():
            return static
        # 模板裏不支持帶參數
        def get_name_cs(self,ttt):
            return self.name
    lll=Person(lll,18)
    fff=Person(fff,18)
    person_list=[lll,fff]
    person_dic={lll:lll}

    file_size=1024
    import datetime
    ctim=datetime.datetime.now()

    h1=<h1>hello</h1>
    script=<script>alert(111)</script>

    user=‘‘

    # return render(request,‘index.html‘,{‘name‘:name})
    # locals() 會把*該*視圖函數內的變量,傳到模板
    return render(request, index.html, locals())

模板語法之過濾器

{{obj|filter__name:param}}  變量名字|過濾器名稱:變量
裏面變量可以參照上面的views.py
<h1>模板語言之過濾器</h1>
{#後面就是個python中的函數,|前面的,是函數的第一個參數,冒號後面的是第二個參數#}
<p>統計字符串長度:{{ name|length }}</p>
<p>統計列表長度:{{ ll|length }}</p>
<p>過濾器之默認值:{{ ll2|default:‘沒有值‘ }}</p>
{# filesizeformat當前值或者傳入文件的大小  #}
<p>過濾器之filesizeformat--1:{{ 1024|filesizeformat }}</p>
<p>過濾器之filesizeformat--2:{{ file_size|filesizeformat }}</p>
{# date 按Nov. 9, 2018這種格式輸出 ctim傳入的是datetime.datetime.now() #}
<p>過濾器之不使用date:{{ ctim }}</p>
<p>過濾器之date:{{ ctim|date:‘Y-m-d‘ }}</p>
{#前閉後開區間 #}
<p>過濾器之slice:{{ ll|slice:‘2:-1‘ }}</p>
{#支持步長#}
<p>過濾器之slice-字符串:{{ name|slice:‘0:3:3‘ }}</p>
{#三個起步#}
{# 取5-3個 剩下用三個點代替 #}
<p>過濾器之truncatechars:{{ ‘dafdadaf‘|truncatechars:5 }}</p>
{# 取三個如果有沒取盡的用三個 #}
<p>過濾器之truncatewords:{{ ‘我 dfaf ga dfgaas 你 dgf adaf‘|truncatewords:5 }}</p>
{# 有safe會解析傳過來的 html語句 沒有不解析 #}
<p>過濾器之不用safe:{{ h1 }}</p>
<p>過濾器之用safe:{{ h1|safe }}</p>

<p>過濾器之不用safe:{{ script }}</p>
{#<p>過濾器之用safe:{{ script|safe }}</p>#}
{# add會讓兩個值相加,數字和字符串不會相加會報錯 字符串是拼接 數字是相加 #}
<p>過濾器之用add:{{ 12|add:‘1‘ }}</p>
<p>過濾器之用add:{{ ‘egon‘|add:‘dsb‘ }}</p>

模板語言之標簽

<h1>模板語言之標簽</h1>
{% for foo in ll %}
    {{ forloop }}
<p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
{% endfor %}

{% for foo in ll %}
    {% for i in person_list %}
  取出外層是第幾次循環
        {{ forloop.parentloop.counter }}
        <p>{{ forloop.first }}--->{{ forloop.counter0 }}--->{{ forloop.revcounter }}----->{{ foo }}</p>
    {% endfor %}
{% endfor %}
**************循環的對象是空,才會走到empty,而不是對象裏面的東西為空
{% for foo in dic2 %}
    <p>{{ foo }}</p>
    {% empty %}
    傻逼了
{% endfor %}
只循環字典的話,取到的是key值
{% for foo in dic %}
取到value的值
{% for foo in dic.values %}
取到key 和 value的值
{% for k,foo in dic.items %}
    <p>{{ k }}----->{{ foo }}</p>
    {% empty %}
    傻逼了
{% endfor %}

{% if user %}
    <a href="">退出</a>
    {% else %}
    <a href="">登錄</a>
    <a href="">註冊</a>
{% endif %}

{#for循環判斷如果是第一次,打印第一次,其他打印正常值#}
{% for foo in ll %}
    {% if forloop.first %}
        <p>第一次的我 </p>
    {% elif forloop.last %}
        <p>最後的我 </p>
    {% else %}
        <p>{{ foo }}</p>
    {% endif %}
{% endfor %}

<hr>
with 相當於取別名,作用:變量太長,可以簡化
{% with name as ttt %}
    {{ ttt }}
    {{ name }}
    {{ user }}

{% endwith %}
------
{% with dic.ll.2 as ttt %}
    {{ ttt }}

    {{ ttt }}

{% endwith %}

-for ,if,with 都要有結束

自定義標簽過濾器

<h1>自定義標簽過濾器</h1>
{% load mytag %}
{#傳多個參數的話:可以:‘aaa:bb:cc‘,也可以:傳列表#}
<p>{{ lqz|yyy:nb }}</p>
<h4>使用自定義的標簽</h4>

<p>{% add_nb egon %}</p>

<p>{% add_3 egon is dsb %}</p>


<hr>
過濾器,可以用在if判斷中
{% if lqz|yyy:nb %}
<p>肯定是True</p>
{% endif %}
標簽不能用在if判斷(報錯)

模板導入與繼承

導入

模版導入-->寫了一個好看的組件,可以復用,
		1 寫一個模板
		2 在模板中:{% include ‘模板的名字‘%}

例如下面的兩個頁面代碼 導入 使用{% include ‘left.html’%} 就會將left.html內的html代碼導入到index內 在left內的標簽使用class定義樣式只要index內有定義那麽會被渲染上去。頁面解析的時候就相當於left。html的代碼存在於index 內

技術分享圖片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <link rel="stylesheet" href="{% static ‘utils/bootstrap-3.3.7-dist/css/bootstrap.css‘ %}">
    <style type="text/css">
        .head{
            height: 100px;
            background:aquamarine;
        }
        .right-top{
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div class="head"></div>
    <div class="container-fluid content">
        <div class="row">
            <div class="col-md-3">
                {% include ‘left.html‘ %}
            </div>
            <div class="col-md-9">
                <div class="right-top" style="background: pink;height: 50px">
                    {% block content_top %}

                    {% endblock %}
                </div>
                <div class="right-middle" style="background: #d43f3a;height: 50px" >
                    {% block content_middle %}

                    {% endblock %}
                </div>
                {% block content_main %}
                    我是母版內容
                {% endblock %}
            </div>
        </div>
    </div>

</body>
</html>
index.html 技術分享圖片
 <ul>
     <a href="{% url ‘temp1‘ %}"><li>a</li></a>
     <a href="{% url ‘temp2‘ %}"><li>b</li></a>
     <li>c</li>
     <li>d</li>
     <li>e</li>
 </ul>
left.html

繼承

模板的繼承
		1 寫一個母版,留一個可擴展的區域(盒子),可以留多個盒子(留的越多,可擴展性越高)
			{%block 名字%}
				可以寫內容
			{%endblock%}
		2 在子模板中使用:
			{%block 名字%}
				子模板的內容
			{%endblock 名字%}

技術分享圖片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    {% load static %}
    <link rel="stylesheet" href="{% static ‘utils/bootstrap-3.3.7-dist/css/bootstrap.css‘ %}">
    <style type="text/css">
        .head{
            height: 100px;
            background:aquamarine;
        }
        .right-top{
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div class="head"></div>
    <div class="container-fluid content">
        <div class="row">
            <div class="col-md-3">
                {% include ‘left.html‘ %}
            </div>
            <div class="col-md-9">
                <div class="right-top" style="background: pink;height: 50px">
                    {% block content_top %}

                    {% endblock %}
                </div>
                <div class="right-middle" style="background: #d43f3a;height: 50px" >
                    {% block content_middle %}

                    {% endblock %}
                </div>
                {% block content_main %}
                    我是母版內容
                {% endblock %}
            </div>
        </div>
    </div>

</body>
</html>
index.html 技術分享圖片
{% extends ‘index.html‘ %}
{% block content_top %}
    <p>toptoptop</p>
    <p>toptoptop</p>
{% endblock %}

{% block content_middle %}
<p>middle</p>
<p>middle</p>
{% endblock %}

{% block content_main %}
<p>main</p>
<p>main</p>
<p>main</p>
{% endblock %}
template1 技術分享圖片
{% extends ‘index.html‘ %}
{% block content_top %}
<p>temp2</p>
<p>temp2</p>
{% endblock %}

{% block content_middle %}
<p>temp2</p>
<p>temp2</p>
{% endblock %}

{% block content_main %}
<p>temp2</p>
<p>temp2</p>
<p>temp2</p>
{% endblock %}
template2

extends 標簽是這裏的關鍵。它告訴模版引擎,這個模版“繼承”了另一個模版。當模版系統處理這個模版時,首先,它將定位父模版——在此例中,就是“index.html”。

那時,模版引擎將註意到 index.html 中的兩個 block 標簽,並用子模版中的內容來替換這些block。

靜態文件

有時候項目進行更改的時候會更改static 相應的settings配置也會變更但是每個頁面也要變更就會增大工作量,所以就需要靜態文件配置

第一種方式

    {% load static %}
    <link rel="stylesheet" href="{% static ‘css/mycss.css‘ %}">

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

Django 模板層 靜態文件