python初試三
在之前的程式中,我們直接生成一個字串,作為http回覆,返回給客戶端。這一過程中使用了django.http.HttpResponse()。
在這樣的一種回覆生成過程中,我們實際上將資料和檢視的格式混合了到上面的字串中。看似方便,卻為我們的管理帶來困難。想像一個成熟的網站,其顯示格式會有許多重複的地方。如果可以把資料和檢視格式分離,就可以重複使用同一檢視格式了。
Django中自帶的模板系統,可以將檢視格式分離出來,作為模板使用。這樣,不但檢視可以容易修改,程式也會顯得美觀大方。
模板初體驗
我們拿一個獨立的templay.html檔案作為模板。它放在templates/west/資料夾下。檔案系統的結構現在是:
mysite/
├── mysite
├── templates
│ └── west
└── west
templay.html檔案的內容是:
<h1>{{ label }}</h1>
可以看到,這個檔案中,有一個奇怪的雙括號包起來的陌生人。這就是我們未來資料要出現的地方。而相關的格式控制,即<h1>標籤,則已經標明在該模板檔案中。
我們需要向Django說明模板檔案的搜尋路徑,修改mysite/settings.py,新增:
# Template dir
TEMPLATE_DIRS = (
os.path.join(BASE_DIR, 'templates/west/'),
)
如果還有其它的路徑用於存放模板,可以增加該元組中的元素,以便Django可以找到需要的模板。
我們現在修改west/views.py,增加一個新的物件,用於向模板提交資料:
# -*- coding: utf-8 -*-
#from django.http import HttpResponse
from django.shortcuts import render
def templay(request):
context = {}
context['label'] = 'Hello World!'
return render(request, 'templay.html', context)
可以看到,我們這裡使用render來替代之前使用的HttpResponse。render還使用了一個詞典context作為引數。這就是我們的資料。
context中元素的鍵值為'label',正對應剛才的“陌生人”的名字。這樣,該context中的‘label’元素值,就會填上模板裡的坑,構成一個完整的http回覆。
作為上節內容的一個小練習,自行修改west/urls.py,讓的URL請求可以找到相應的view物件。
訪問,可以看到頁面:
流程
再來回顧一下整個流程。west/views.py中的templay()在返回時,將環境資料context傳遞給模板templay.html。Django根據context元素中的鍵值,將相應資料放入到模板中的對應位置,生成最終的http回覆。
這一模板系統可以與Django的其它功能相互合作。上一回,我們從資料庫中提取出了資料。如果將資料庫中的資料放入到context中,那麼就可以將資料庫中的資料傳送到模板。
修改上次的west/views.py中的staff:
def staff(request):
staff_list = Character.objects.all()
staff_str = map(str, staff_list)
context = {'label': ' '.join(staff_str)}
return render(request, 'templay.html', context)
迴圈與選擇
Django實際上提供了豐富的模板語言,可以在模板內部有限度的程式設計,從而更方便的編寫檢視和傳送資料。
我們下面體驗一下最常見的迴圈與選擇。
上面的staff中的資料實際上是一個資料容器,有三個元素。剛才我們將三個元素連線成一個字串傳送。
實際上,利用模板語言,我們可以直接傳送資料容器本身,再迴圈顯示。修改staff()為:
def staff(request):
staff_list = Character.objects.all()
return render(request, 'templay.html', {'staffs': staff_list})
從資料庫中查詢到的三個物件都在staff_list中。我們直接將staff_list傳送給模板。
將模板templay.html修改為:
{% for item in staffs %}
<p>{{ item.id }}, {{item}}</p>
{% endfor %}
我們以類似於Python中for迴圈的方式來定義模板中的for,以顯示staffs中的每個元素。
還可以看到,物件.屬性名的引用方式可以直接用於模板中。
選擇結構也與Python類似。根據傳送來的資料是否為True,Django選擇是否顯示。使用方式如下:
{% if condition1 %}
... display 1
{% elif condiiton2 %}
... display 2
{% else %}
... display 3
{% endif %}
其中的elif和else和Python中一樣,是可以省略的。
模板繼承
模板可以用繼承的方式來實現複用。我們下面用templay.html來繼承base.html。這樣,我們可以使用base.html的主體,只替換掉特定的部分。
新建templates/west/base.html:
<html>
<head>
<title>templay</title>
</head>
<body>
<h1>come from base.html</h1>
{% block mainbody %}
<p>original</p>
{% endblock %}
</body>
</html>
該頁面中,名為mainbody的block標籤是可以被繼承者們替換掉的部分。
我們在下面的templay.html中繼承base.html,並替換特定block:
{% extends "base.html" %}
{% block mainbody %}
{% for item in staffs %}
<p>{{ item.id }},{{ item.name }}</p>
{% endfor %}
{% endblock %}
第一句說明templay.html繼承自base.html。可以看到,這裡相同名字的block標籤用以替換base.html的相應block。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70026630/viewspace-3001047/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 初試PythonPython
- python初試Python
- python初試七Python
- python初試二Python
- python初試四Python
- python初試五Python
- python初試六Python
- Python爬蟲初試Python爬蟲
- 初學Python(三)——字典Python
- Python呼叫MySQL模組初試PythonMySql
- Python Scrapy 爬蟲(二):scrapy 初試Python爬蟲
- 初試
- 初試python的socket程式設計--ftpPython程式設計FTP
- Python 快速教程(Django01):初試天涯PythonDjango
- Kafka初試Kafka
- github 初試Github
- 初試 GithubGithub
- 初試Gevent – 高效能的Python併發框架Python框架
- 產品初學的三步:瞭解、嘗試、想想
- 騰訊前端初試前端
- Rust: tokio初試Rust
- Vue + GraphQL初試Vue
- 初嘗試swiftSwift
- sqlite 小刀 初試SQLite
- gRPC學習之三:初試GO版gRPC開發RPCGo
- 初識 webpack (三)Web
- Accessability 專案初試
- 初學PythonPython
- 初識pythonPython
- R語言實戰試卷 第三章 圖形初階R語言
- 2020年焊工(初級)考試試題及焊工(初級)考試軟體
- Python資料分析初體驗,需要解答的三大問題!Python
- PHP 初級 試崗要求PHP
- 初試MongoDB資料庫MongoDB資料庫
- 阿里雲IoT初試阿里
- Swift 3 0 FMDB 初試Swift
- 初試npm包釋出NPM
- 初試php中的curlPHP