Python全棧Web(Django框架、模板)

巴黎香榭發表於2018-10-16

1.Django中的模板(Templates)

1.什麼是模板

模板就是要動態呈現給使用者的網頁

模板的本質就是網頁- 前後端,動靜結合的網頁

Django的模板引擎是由Django自己提供的,並不是Jinja2,

                所以Django的模板語法與Flask(Jinja2)的語法會有一些不同

2.模板的設定

在 settings.py 中 有一個 TEMPLATES 變數

1.BACKEND:指定使用的模板的引擎

2.DIRS :指定模板的存放目錄們

1.如果寫東西:則按照寫好的路徑去找模板

2.如果未寫東西:那麼Django會自動的到每個應用中所有一個叫templates的目錄來作為模板的存放目錄

3.APP_DIRS : 是否自動搜尋應用中的目錄

True:表示搜尋應用中的 templates 的目錄

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

# 靜態檔案的訪問路徑
STATIC_URL = `/static/`
# 靜態檔案的儲存路徑
STATICFILES_DIRS = (os.path.join(BASE_DIR, `static`),)

1.通過 loader 物件獲取模板,再通過HttpResponse進行響應

from django.template import loader

def xxViews(request):

#1.通過 loader 載入模板

t = loader.get_template(“模板名稱”)

#2.將模板渲染成字串

html = t.render()

#3.將字串通過HttpResponse響應給客戶端

return HttpResponse(html)

2.使用 render 直接載入並響應模板

def xxViews(request):

return render(request,`模板的名稱`)


# Create your views here.
def temp_views(request):
  #1.通過loader載入模板
  t=loader.get_template(`01-temp.html`)
  #2.將模板渲染成字串
  html=t.render()
  #3.再通過HttpResponse將字串響應給瀏覽器
  return HttpResponse(html)

# 使用render載入模板
def temp02_views(request):
  return render(request, `01-temp.html`)

4.模板的語法

1.變數

1.作用:將後端的資料傳遞給模板進行顯示

2.在Django中允許作為變數傳遞給模板的資料型別

字串,整數,列表,元組,字典,函式,物件

3.變數的語法

變數們必須要封裝到字典中才能傳遞給模板

1.使用 loader 載入模板

dic = {

`變數名1`:`值1`,

`變數名2`:`值2`,

}

t = loader.get_template(`xxx.html`)

html = t.render(locals() 或 dic)

return HttpResponse(html)

2.使用 render 載入並返回模板

dic = {

`變數名1`:`值1`,

`變數名2`:`值2`,

}

return render(request,`xx.html`,dic)

4.在模板中使用變數

{{變數名}}


# http://localhost:8000/03-var
def var_views(request):
  str = "模板中的變數-字串"
  num = 3306
  tup = (`謝遜`,`韋一笑`,`殷素素`,`金花婆婆`)
  list = [`孫悟空`,`豬八戒`,`沙和尚`]
  dic = {
    `BJ`:`北京`,
    `SZ`:`深圳`,
    `SH`:`上海`,
  }
  say = sayHi()
  dog = Dog()


  return render(request,`03-var.html`,locals())
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

  <!-- 取出每個變數進行顯示 -->
  <h3>str:{{ str }}</h3>
  <h3>num:{{ num }}</h3>
  <h3>tup:{{ tup }}</h3>
  <h3>tup[0]:{{ tup.0 }}</h3>
  <h3>list:{{ list }}</h3>
  <h3>list[1]:{{ list.1 }}</h3>
  <h3>dic:{{ dic }}</h3>
  <h3>dic[`SZ`]:{{ dic.SZ }}</h3>
  <h3>say:{{ say }}</h3>
  <h3>dog.name:{{ dog.name }}</h3>
  <h3>dog.eat:{{ dog.eat }}</h3>

  <!-- 寵物名稱:{{ dog.name }} -->
  {% comment "寵物名稱" %}
  寵物名稱:{{ dog.name }}
  {% endcomment %}
</body>
</html>

django中不同於jinja2的模板 django的模板中不能使用索引和切片

只能通過·的方式來獲取元素 但不影響迴圈

2.標籤

1.作用

將伺服器端的功能嵌入到模板中

2.語法

{% 標籤內容 %}

3.常用標籤

1. comment 標籤

2. for 標籤

作用:迴圈遍歷 列表,字典,元組

語法:

{% for 變數 in 列表|元組|字典 %}

{% endfor %}

迴圈中允許使用 forloop 內建變數來獲取迴圈的資訊

forloop.counter : 當前迴圈遍歷的次數

forloop.first : 判斷是否為第一次迴圈

forloop.last : 判斷是否為最後一次迴圈

3.if 標籤

作用:在模板中完成變數的判斷操作

語法:

1. if

{% if 條件 %}

滿足條件時要執行的內容

{% endif %}

2. if … else

{% if 條件 %}

滿足條件時要執行的內容

{% else %}

不滿足條件時要執行的內容

{% endif %}

3.if … elif … else

{% if 條件1 %}

滿足條件1時要執行的內容

{% elif 條件2 %}

或滿足條件2時要執行的內容

{% elif 條件3 %}

或滿足條件3時要執行的內容

{% else %}

或以上條件都不滿足時要執行的內容

{% endif %}

  <!-- 通過for迴圈便利tup -->
  <h1>使用for迴圈便利tup</h1>
  {% for t in tup %}
    <p
      {% if forloop.first %}
        style="background:red;"
      {% elif forloop.last %}
        style="background:blue;"
      {% else %}
        style="background:pink;"
      {% endif %}
    >
      <span>內容:{{ t }}</span>
      <br>
      <span>下標:{{ forloop.counter0 }}</span>
      <br>
      <span>次數:{{ forloop.counter }}</span>
      <br>
      <span>第一次迴圈:{{ forloop.first }}</span>
      <br>
      <span>最後一次迴圈:{{ forloop.last }}</span>
    </p>
  {% endfor %}

  <h1>通過for實現的select</h1>
  <select>
    {% for t in tup %}
      <option value="{{ forloop.counter0 }}"
       {% if forloop.last %}
         selected
       {% endif %}
      >{{ t }}</option>
    {% endfor %}
  </select>

3.過濾器

1.什麼是過濾器

在變數輸出顯示之前,對變數進行篩選和過濾

2.過濾器的語法

{{變數|過濾器:引數}}

3.常用過濾器

1.{{value|upper}}

將value變為大寫

2.{{value|lower}}

將value變為小寫

3.{{value|add:num}}

將num值累加到value之後

4.{{value|floatformat:n}}

將value四捨五入到n位小數

5.{{value|truncatechars:n}}

將value擷取保留至n位字元(包含…)

4.靜態檔案

1.什麼是靜態檔案

在Django中,不被直譯器所動態解析的檔案就是靜態檔案

2.Django中靜態檔案的處理

在settings.py中設定有關靜態檔案的資訊:

1.設定靜態檔案的訪問路徑

在瀏覽器中通過哪個地址能夠找到靜態檔案

STATIC_URL = `/static/`

如果訪問路徑是 http://localhost:8000/static/…,那麼就到靜態檔案儲存路徑中找檔案而不走路由(urls.py)

2.設定靜態檔案的儲存路徑

指定靜態檔案儲存在伺服器上的哪個位置處

STATICFILES_DIRS=(os.path.join(BASE_DIR,`static`),)

靜態檔案目錄的存放位置:

1.在專案的根目錄處建立一個 static 目錄,用於儲存靜態檔案們

2.每個應用中也可以建立一個 static 目錄,用於儲存靜態檔案們

3.訪問靜態檔案

1.直接使用靜態檔案訪問路徑進行訪問

http://localhost:8000/static/..

ex:

<img src=”/static/images/a.jpg”>

<img src=”http://localhost:8000/static/images/a.jpg”>

2.使用 {% static %} 訪問靜態資源

{% static %} 表示的就是靜態資源的訪問路徑

1.在模板的最頂層增加

{% load static %}

2.在使用靜態資源時

<img src=”{% static `images/a.jpg`%}”>


# http://localhost:8000/04-static
def static_views(request):
  return render(request, `04-static.html`)
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <!-- 顯示靜態資原始檔 -->
  <p>
    <img src="/static/images/shuaige.jpg">
  </p>
  <p>
    <img src="http://localhost:8000/static/images/shuaige.jpg">
  </p>
  <p>
    <img src="{% static `images/shuaige.jpg` %}">
  </p>
</body>
</html>


相關文章