1.Django入門
- 準(zhǔn)備
Django是一個(gè)Web框架逆日,一套用于幫助開發(fā)交互式網(wǎng)站的工具,Django能夠響應(yīng)網(wǎng)頁請(qǐng)求衣屏,還能讓你更輕松地讀寫數(shù)據(jù)庫宵蕉,管理用戶等
建立項(xiàng)目時(shí)炎疆,首先以規(guī)范的方式對(duì)項(xiàng)目進(jìn)行描述,再建立虛擬環(huán)境国裳,以便在其中創(chuàng)建項(xiàng)目
通過編寫一個(gè)名為"學(xué)習(xí)筆記"的Web應(yīng)用程序進(jìn)行學(xué)習(xí) - 建立虛擬環(huán)境
要使用Django形入,首先需要建立一個(gè)虛擬工作環(huán)境,虛擬環(huán)境時(shí)系統(tǒng)的一個(gè)位置缝左,可以在其中安裝包亿遂,并將其與其他Python包隔離(將項(xiàng)目的庫與其他項(xiàng)目分離是有益的)
為項(xiàng)目新建一個(gè)目錄,將其命名為learning_log,切換到這個(gè)目錄渺杉,并創(chuàng)建一個(gè)虛擬環(huán)境
MacBook-Pro:learning_log yangdongxing$ python3 -m venv ll_env
MacBook-Pro:learning_log yangdongxing$
運(yùn)行模塊venv蛇数,創(chuàng)建一個(gè)名為ll_env的虛擬環(huán)境
如果python版本比較早,安裝virtualenv包
$ pip install --user virtualenv
使用virtualenv創(chuàng)建虛擬環(huán)境
learning_log$ virtualenv ll_env
New python executable in ll_env/bin/python Installing setuptools, pip...done. learning_log$
- 激活虛擬環(huán)境
建立虛擬環(huán)境后是越,使用下面的命令激活
MacBook-Pro:learning_log yangdongxing$ source ll_env/bin/activate
(ll_env) MacBook-Pro:learning_log yangdongxing$
這個(gè)命令運(yùn)行l(wèi)l_env/bin中的腳本activate耳舅。環(huán)境處于活動(dòng)狀態(tài)時(shí),環(huán)境名將包含在括號(hào)內(nèi)倚评,此時(shí)浦徊,可以在環(huán)境中安裝包,并使用已安裝的包天梧,在ll_envz中安裝的包僅在該環(huán)境處于活動(dòng)狀態(tài)時(shí)才可用
Windows中使用以下命令激活
ll_env\Scripts\activate(不包含source)
使用命令deactivate停止使用虛擬環(huán)境
(ll_env) MacBook-Pro:learning_log yangdongxing$ deactivate
MacBook-Pro:learning_log yangdongxing$
- 安裝Django
創(chuàng)建并激活虛擬環(huán)境后盔性,就可以安裝Django了
MacBook-Pro:learning_log yangdongxing$ source ll_env/bin/activate
(ll_env) MacBook-Pro:learning_log yangdongxing$ pip3 install Django
Collecting Django
Downloading https://files.pythonhosted.org/packages/23/91/2245462e57798e9251de87c88b2b8f996d10ddcb68206a8a020561ef7bd3/Django-2.0.5-py3-none-any.whl (7.1MB)
100% |████████████████████████████████| 7.1MB 36kB/s
Collecting pytz (from Django)
Retrying (Retry(total=4, connect=None, read=None, redirect=None)) after connection broken by 'ProtocolError('Connection aborted.', ConnectionResetError(54, 'Connection reset by peer'))': /simple/pytz/
Using cached https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl
Installing collected packages: pytz, Django
Successfully installed Django-2.0.5 pytz-2018.4
You are using pip version 9.0.1, however version 10.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(ll_env) MacBook-Pro:learning_log yangdongxing$
- 在Django中創(chuàng)建項(xiàng)目
(ll_env) MacBook-Pro:learning_log yangdongxing$ django-admin.py startproject learning_log .
(ll_env) MacBook-Pro:learning_log yangdongxing$ ls
learning_log ll_env manage.py
(ll_env) MacBook-Pro:learning_log yangdongxing$ ls learning_log
__init__.py settings.py urls.py wsgi.py
新建項(xiàng)目(django-admin.py startproject learning_log .)創(chuàng)建了名為learning_log的項(xiàng)目。末尾又一個(gè)句點(diǎn)呢岗,是讓新項(xiàng)目使用合適的目錄結(jié)構(gòu)冕香,這樣開發(fā)玩后可輕松的將應(yīng)用程序部署到服務(wù)器
句點(diǎn)不能忘蛹尝,忘記了這個(gè)句點(diǎn), 就將創(chuàng)建的文件和文件夾刪除(ll_env除外)悉尾,再重新運(yùn)行這個(gè)命令突那。
Django新建了一個(gè)名為 learning_log的目錄。它還創(chuàng)建了一個(gè)名為manage.py的文件构眯,這是一個(gè)簡(jiǎn)單的程序愕难,它接受命令 并將其交給Django的相關(guān)部分去運(yùn)行。我們將使用這些命令來管理諸如使用數(shù)據(jù)庫和運(yùn)行服務(wù)器 等任務(wù)鸵赖。
目錄learning_log包含4個(gè)文件,其中最重要的是settings.py拄衰、urls.py和wsgi.py它褪。文件 settings.py指定Django如何與你的系統(tǒng)交互以及如何管理項(xiàng)目。在開發(fā)項(xiàng)目的過程中翘悉,我們將修 改其中一些設(shè)置茫打,并添加一些設(shè)置。文件urls.py告訴Django應(yīng)創(chuàng)建哪些網(wǎng)頁來響應(yīng)瀏覽器請(qǐng)求妖混。 文件wsgi.py幫助Django提供它創(chuàng)建的文件老赤,這個(gè)文件名是web server gateway interface(Web服務(wù) 器網(wǎng)關(guān)接口)的首字母縮寫。
- 創(chuàng)建數(shù)據(jù)庫
Django將大部分與項(xiàng)目相關(guān)的信息都存儲(chǔ)在數(shù)據(jù)庫中,因此需要?jiǎng)?chuàng)建一個(gè)供Django使用的數(shù)據(jù)庫
(ll_env) yangdongxingdeMacBook-Pro:learning_log yangdongxing$ python3 manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying auth.0007_alter_validators_add_error_messages... OK
Applying auth.0008_alter_user_username_max_length... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
(ll_env) yangdongxingdeMacBook-Pro:learning_log yangdongxing$ ls
db.sqlite3 learning_log ll_env manage.py
將修改數(shù)據(jù)庫成為遷移數(shù)據(jù)庫制市,首次執(zhí)行命令migrate時(shí)抬旺,將讓Django確保數(shù)據(jù)庫與項(xiàng)目的當(dāng)前狀態(tài)匹配。
- 查看項(xiàng)目
使用命令runserver核實(shí)Django是否正確地創(chuàng)建了項(xiàng)目
(ll_env) yangdongxingdeMacBook-Pro:learning_log yangdongxing$ python manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
May 03, 2018 - 00:24:15
Django version 2.0.5, using settings 'learning_log.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
Django啟動(dòng)了一個(gè)服務(wù)器祥楣,可以查看系統(tǒng)中地項(xiàng)目开财,瀏覽器打開http://localhost:8000/可以查看Django生成的網(wǎng)頁
關(guān)閉服務(wù)器,使用control+C或Ctrl+C
如果出現(xiàn)錯(cuò)誤信息“That port is already in use”(指定端口已被占用)误褪,執(zhí)行命令 manage.py runserver 8001责鳍,讓Django使用另一個(gè)端口,如果端口依然不可用兽间,使用8002历葛,8003一次增大
2.創(chuàng)建應(yīng)用程序
Django項(xiàng)目是由一系列應(yīng)用程序組成,協(xié)同工作嘀略,讓項(xiàng)目成為一個(gè)整體恤溶,目前只創(chuàng)建了一個(gè)應(yīng)用程序,它將完成項(xiàng)目大部分工作帜羊。
當(dāng)前窗口運(yùn)行著runserver宏娄,再打開一個(gè)終端窗口,切換到manage.py所在地目錄逮壁,激活該虛擬環(huán)境孵坚,再執(zhí)行命令startapp
MacBook-Pro:learning_log yangdongxing$ source ll_env/bin/activate
(ll_env) MacBook-Pro:learning_log yangdongxing$ python manage.py startapp learning_logs
(ll_env) MacBook-Pro:learning_log yangdongxing$ ls
db.sqlite3 learning_log learning_logs ll_env manage.py
(ll_env) MacBook-Pro:learning_log yangdongxing$ ls learning_logs/
__init__.py apps.py models.py views.py
admin.py migrations tests.py
(ll_env) MacBook-Pro:learning_log yangdongxing$
startapp appname命令讓Django建立創(chuàng)建應(yīng)用程序所需的基礎(chǔ)設(shè)施粮宛,想再再項(xiàng)目目錄下多了個(gè)learning_logs文件夾,打開這個(gè)文件夾卖宠,創(chuàng)建了多個(gè)文件巍杈,使用models.py來定義我們要再應(yīng)用程序中管理的數(shù)據(jù)
- 定義模型
打開文件models.py,查看文件中的內(nèi)容
from django.db import models
# Create your models here.
models.py中導(dǎo)入了模塊models扛伍,在這里創(chuàng)建自己的模型筷畦,模型告訴Django如何處理應(yīng)用程序中存儲(chǔ)的數(shù)據(jù),在代碼層面刺洒,模型就是一個(gè)類鳖宾,下面是表示用戶將要存儲(chǔ)的主題的模型
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用戶學(xué)習(xí)的主題"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
屬性CharFiled(由字符串或文本組成的數(shù)據(jù),需要存儲(chǔ)少量的文本逆航,必須告訴Django該在數(shù)據(jù)庫中預(yù)留多少空間鼎文,這里max_length設(shè)置成來200(即200個(gè)字符))
屬性date_added是一個(gè)DateTimeFiled(記錄日期和時(shí)間的數(shù)據(jù),傳遞了實(shí)參auto_add_now= True因俐,每當(dāng)用戶創(chuàng)建新主題時(shí)拇惋,都讓Django將這個(gè)屬性自動(dòng)設(shè)置成當(dāng)前的日期和時(shí)間)
在https://docs.djangoproject.com/en/1.8/ref/models/fields/中查看模型中使用的各種字段
Django調(diào)用str()來顯示模型的簡(jiǎn)單表示,這里返回存儲(chǔ)在屬性text中的字符串(python2.7中抹剩,使用的方法是unicode())
- 激活模型
使用模型撑帖,必須讓Django將應(yīng)用程序包含到項(xiàng)目中,打開learning/learning_log中的settings.py,查看那些應(yīng)用程序安裝在項(xiàng)目中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
]
這是一個(gè)元組澳眷,告訴Django項(xiàng)目是由那些應(yīng)用程序組成的胡嘿,將前面創(chuàng)建的應(yīng)用程序添加到這個(gè)元組中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
#我的應(yīng)用程序
'learning_logs',
]
接下來,讓Django修改數(shù)據(jù)庫钳踊,使其能夠存儲(chǔ)與模型Topic相關(guān)的信息
(ll_env) MacBook-Pro:learning_log yangdongxing$ python manage.py makemigrations learning_logs
Migrations for 'learning_logs':
learning_logs/migrations/0001_initial.py
- Create model Topic
(ll_env) MacBook-Pro:learning_log yangdongxing$
命令makemigrations讓Django確定該如何修改數(shù)據(jù)庫灶平,使其能夠存儲(chǔ)與我們定義的新模型相 關(guān)聯(lián)的數(shù)據(jù)。輸出表明Django創(chuàng)建了一個(gè)名為0001_initial.py的遷移文件箍土,這個(gè)文件將在數(shù)據(jù)庫中 為模型Topic創(chuàng)建一個(gè)表逢享。
應(yīng)用上面的遷移,讓Django修改數(shù)據(jù)庫
(ll_env) MacBook-Pro:learning_log yangdongxing$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, learning_logs, sessions
Running migrations:
Applying learning_logs.0001_initial... OK
最后的OK表明吴藻,Django確認(rèn)為learning_logs應(yīng)用遷移時(shí)一切正常
每當(dāng)修改管理的數(shù)據(jù)時(shí)瞒爬,都采用下面三個(gè)步驟:修改models.py;對(duì)learning_logs調(diào)用makemigrations沟堡;讓Django遷移項(xiàng)目
3.Django管理網(wǎng)站
- 創(chuàng)建超級(jí)用戶(具備所有權(quán)限的用戶)
(ll_env) MacBook-Pro:learning_log yangdongxing$ python manage.py createsuperuser
Username (leave blank to use 'yangdongxing'): ll_admin
Email address:
Password:
Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Password:
Password (again):
Superuser created successfully.
(ll_env) MacBook-Pro:learning_log yangdongxing$
用戶名ll_admin
Django并不存儲(chǔ)輸入的密碼侧但,而存儲(chǔ)從該密碼派生出來的一個(gè)字符串——散列值。每當(dāng)你輸入密碼時(shí)航罗,Django都計(jì)算其散列值禀横,并將結(jié)果與存儲(chǔ)的散列值進(jìn)行比較
- 向管理網(wǎng)站注冊(cè)模型
Django自動(dòng)在管理網(wǎng)站中添加了一些模型,如User和Group粥血,但對(duì)于創(chuàng)建的模型柏锄,必須手工進(jìn)行注冊(cè)酿箭,在創(chuàng)建應(yīng)用程序learning_logs時(shí),Django在models.py所在的目錄中創(chuàng)建了一個(gè)名為admin.py的文件
from django.contrib import admin
# Register your models here.
向管理網(wǎng)站注冊(cè)Topic
from django.contrib import admin
from learning_logs.models import Topic
# Register your models here.
admin.site.register(Topic)
訪問http://localhost:8000/admin/
輸入剛才創(chuàng)建的超級(jí)用戶的用戶名和密碼
在這個(gè)網(wǎng)頁中趾娃,能夠添加和修改用戶和用戶組缭嫡,還可以管理與剛才定義的模型Topic相關(guān)的數(shù)據(jù)
添加主題
單機(jī)Topic進(jìn)入主題網(wǎng)頁,還沒有添加任何主題
點(diǎn)擊Add抬闷,在Text屬性輸入框輸入Chess妇蛀,保存(save)
在創(chuàng)建一個(gè)RockClimbing主題
- 定義模型Entry
在學(xué)習(xí)筆記中添加的條目定義模型。每個(gè)條目都與特定主題相關(guān)聯(lián)笤成,這種關(guān)系被稱為多對(duì)一關(guān)系评架,即多個(gè)條目可關(guān)聯(lián)到同一個(gè)主題。
from django.db import models
# Create your models here.
class Topic(models.Model):
"""用戶學(xué)習(xí)的主題"""
text = models.CharField(max_length=200)
date_added = models.DateTimeField(auto_now_add=True)
def __str__(self):
"""返回模型的字符串表示"""
return self.text
class Entry(models.Model):
"""學(xué)到的有關(guān)某個(gè)主題的具體知識(shí)"""
#topic = models.ForeignKey(Topic)
topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
text = models.TextField()
date_added models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'entries'
def __str__(self):
"""返回模型的字符串表示"""
return self.text[:50]+"..."
書上寫的是topic = models.ForeignKey(Topic)炕泳,報(bào)錯(cuò)init() missing 1 required positional argument: 'on_delete' 纵诞,原因是,Django 高版本中喊崖,需要寫一個(gè)參數(shù)topic = models.ForeignKey(Topic,on_delete=models.CASCADE)
第一個(gè)屬性topic是一個(gè)ForeignKey實(shí)例挣磨。外鍵是一個(gè)數(shù)據(jù)庫術(shù)語雇逞,它引用了數(shù)據(jù)庫中的另一條記錄;這些代碼將每個(gè)條目關(guān)聯(lián)到特定的主題荤懂。每個(gè)主題創(chuàng)建時(shí),都給它分配了一個(gè)鍵(或ID)塘砸。需要在兩項(xiàng)數(shù)據(jù)之間建立聯(lián)系時(shí)节仿, Django使用與每項(xiàng)信息相關(guān)聯(lián)的鍵。稍后我們將根據(jù)這些聯(lián)系獲取與特定主題相關(guān)聯(lián)的所有條目
text屬性是TextField實(shí)例掉蔬,這種字段不需要長(zhǎng)度限制
在Entry類中嵌套了Meta類廊宪,Meta存儲(chǔ)用于管理模型的額外信息,設(shè)置一個(gè)特殊屬性女轿,讓Django在需要時(shí)使用Entries來表示多個(gè)條目箭启。如果沒有這個(gè)類, Django將使用Entrys來表示多個(gè)條目
方法str()告訴Django蛉迹,呈現(xiàn)條目時(shí)應(yīng)顯示哪些信息傅寡。由于條目包含的文本可能很長(zhǎng),讓Django只顯示text的前50個(gè)字符北救。添加了一個(gè)省略號(hào)荐操,指出顯示的并非整個(gè)條目。
- 遷移模型ENtry
命令同上Topic
python manage.py makemigrations learning_logs
- 向管理網(wǎng)站注冊(cè)Entry
命令同上珍策,修改admin.py
from django.contrib import admin
from learning_logs.models import Topic,Entry
# Register your models here.
admin.site.register(Topic)
admin.site.register(Entry)
刷新http://localhost/admin/托启,進(jìn)入Entries,點(diǎn)擊Add,看到一個(gè)下拉列表,能夠選擇要為哪個(gè)主題創(chuàng)建條目攘宙,還有一個(gè)用于輸入條目的文本框屯耸。從下拉列表中選擇Chess樟澜,并添加一個(gè)條目
再添加一個(gè)
- Django shell
輸入一些數(shù)據(jù)后议双,就可通過交互式終端會(huì)話以編程方式查看這些數(shù)據(jù)了。這種交互式環(huán)境稱 為Django shell,可以用來測(cè)試項(xiàng)目和排除其故障
(ll_env) MacBook-Pro:learning_log yangdongxing$ python manage.py shell
Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from learning_logs.models import Topic
>>> Top.objects.all()
Traceback (most recent call last):
File "<console>", line 1, in <module>
NameError: name 'Top' is not defined
>>> Topic.objects.all()
<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>
>>>
遍歷查詢集帝际,查看分配給每個(gè)主題對(duì)象的ID
>>> topics = Topic.objects.all()
>>> for topic in topics:
... print(topic.id,topic)
...
1 Chess
2 Rock Climbing
>>>
直到對(duì)象ID后,就可以獲取該對(duì)象并查看其任何屬性
>>> t = Topic.objects.get(id=1)
>>> t.text
'Chess'
>>> t.date_added
datetime.datetime(2018, 5, 3, 4, 52, 5, 942154, tzinfo=<UTC>)
>>>
查看與主題關(guān)聯(lián)的條目
>>> t.entry_set.all()
<QuerySet [<Entry: The opening is the first part of the game, roughly...>, <Entry: In the opening phase of the game, it’s important t...>]>
>>>
每次修改模型后修陡,都要重啟shell邀桑,這樣才能看到修改效果,退出shell會(huì)話工窍,使用control+D
4. 創(chuàng)建網(wǎng)頁割卖,學(xué)習(xí)筆記主頁
使用Django創(chuàng)建網(wǎng)頁的過程通常分為三個(gè)階段:定義URL,編寫視圖和編寫模版
- 映射URL
用戶通過在瀏覽器中輸入U(xiǎn)RL以及單擊鏈接來請(qǐng)求網(wǎng)頁患雏,因此需要確定項(xiàng)目需要哪些 URL鹏溯。主頁的URL最重要,它是用戶用來訪問項(xiàng)目的基礎(chǔ)URL淹仑。當(dāng)前丙挽,基礎(chǔ)URL(http://localhost:8000/)返回默認(rèn)的Django網(wǎng)站,讓我們知道正確地建立了項(xiàng)目匀借。接下來將修改這一點(diǎn)颜阐,將這個(gè)基礎(chǔ)URL映射到“學(xué)習(xí)筆記”的主頁。
打開項(xiàng)目主文件夾learning_log中的文件urls.py
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
變量urlpatterns包含項(xiàng)目中的應(yīng)用程序的URL吓肋。包含模塊admin.site.urls凳怨,該模塊定義了可在管理網(wǎng)站中請(qǐng)求的所有 URL。
將learning_logs的URL添加進(jìn)去
from django.contrib import admin
from django.urls import path,include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('learning_logs.urls', namespace='learning_logs')),
]
在learning_logs下新建urls.py
"""定義learning_logs的URL模式"""
from django.conf.urls import url
from . import views
app_name='learning_logs'
urlpatterns = [
# 主頁
url(r'^$', views.index, name='index'), ]
書上沒有app_name='learning_logs' 是鬼,加會(huì)報(bào)錯(cuò)Specifying a namespace in include() without providing an app_name 'django.co
- 編寫視圖肤舞,打開learning_logs中的文件views.py
from django.shortcuts import render
# Create your views here.
為主頁編寫視圖
from django.shortcuts import render
# Create your views here.
def index(request):
"""學(xué)習(xí)筆記的主頁"""
return render(request,'learning_logs/index.html')
pass
- 創(chuàng)建其他網(wǎng)頁
創(chuàng)建倆個(gè)顯示數(shù)據(jù)的網(wǎng)頁,一個(gè)列出所有的主題均蜜,另一個(gè)顯示特定主題的所有條目
模版繼承
首先來創(chuàng)建一個(gè)名為base.html的模板李剖,并將其存儲(chǔ)在index.html所在的目錄中。這個(gè)文件 包含所有頁面都有的元素;其他的模板都繼承base.html
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
</p>>
{% block content %}{% endblock content %}
子模版
{% extends "learning_logs/base.html" %}
{% block content %}
{% endblock content %}
子模板的第一行必須包含標(biāo)簽{% extends %}囤耳,讓Django知道它繼 承了哪個(gè)父模板篙顺。文件base.html位于文件夾learning_logs中,因此父模板路徑中包含learning_logs紫皇。 這行代碼導(dǎo)入模板base.html的所有內(nèi)容慰安,讓index.html能夠指定要在content塊預(yù)留的空間中添加 的內(nèi)容。
插入了一個(gè)名為content的{% block %}標(biāo)簽聪铺,以定義content塊化焕。不是從父模板 繼承的內(nèi)容都包含在content塊中,在這里是一個(gè)描述項(xiàng)目“學(xué)習(xí)筆記”的段落
使用標(biāo)簽{% endblock content %}指出了內(nèi)容定義的結(jié)束位置铃剔。
在子模板中撒桨,只需包含當(dāng)前網(wǎng)頁特有的內(nèi)容查刻。這不僅簡(jiǎn)化 了每個(gè)模板,還使得網(wǎng)站修改起來容易得多凤类。要修改很多網(wǎng)頁都包含的元素穗泵,只需在父模板中修 改該元素
在大型項(xiàng)目中,通常有一個(gè)用于整個(gè)網(wǎng)站的父模板——base.html谜疤,且網(wǎng)站的每個(gè)主要部 2
分都有一個(gè)父模板佃延。每個(gè)部分的父模板都繼承base.html,而網(wǎng)站的每個(gè)網(wǎng)頁都繼承相應(yīng) 部分的父模板
- 顯示所有主題的頁面
URL模式
"""定義learning_logs的URL模式"""
from django.conf.urls import url
from . import views
app_name='learning_logs'
urlpatterns = [
# 主頁
url(r'^$', views.index, name='index'),
# 顯示所有的主題
url(r'^topics/$', views.topics, name='topics'),
]
視圖
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
"""學(xué)習(xí)筆記的主頁"""
return render(request,'learning_logs/index.html')
passxxxxx
def topics(request):
"""顯示所有的主題"""
topics = Topic.objects.order_by('date_added')
context = {'topics':topics}
return render(request,'learning_logs/topics.html',context)
模版(新建topics.html)
{% extends "learning_logs/base.html" %}
{% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>{{ topic }}</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
修改base.html夷磕,使其包含到顯示所有主題的頁面的鏈接
<p>
<a href="{% url 'learning_logs:index' %}">Learning Log</a>
<a href="{% url 'learning_logs:topics' %}">Topics</a>
</p>>
{% block content %}{% endblock content %}
顯示特定主題的頁面
URL模式履肃,要查看主題Chess(其id為1)的詳細(xì)頁面,URL將為http://localhost:8000/topics/1/
"""定義learning_logs的URL模式"""
from django.conf.urls import url
from . import views
app_name='learning_logs'
urlpatterns = [
# 主頁
url(r'^$', views.index, name='index'),
# 顯示所有的主題
url(r'^topics/$', views.topics, name='topics'),
# 特定主題的詳細(xì)頁面
url(r'^topics/(?P<topic_id>\d+)/$', views.topic, name='topic'),
]
視圖
from django.shortcuts import render
from .models import Topic
# Create your views here.
def index(request):
"""學(xué)習(xí)筆記的主頁"""
return render(request,'learning_logs/index.html')
passxxxxx
def topics(request):
"""顯示所有的主題"""
topics = Topic.objects.order_by('date_added')
context = {'topics':topics}
return render(request,'learning_logs/topics.html',context)
def topic(request, topic_id):
"""顯示單個(gè)主題及其所有的條目"""
topic = Topic.objects.get(id=topic_id)
entries = topic.entry_set.order_by('-date_added')
context = {'topic': topic, 'entries': entries}
return render(request, 'learning_logs/topic.html', context)
這個(gè)函數(shù)接受正則表達(dá)式(?P<topic_id>\d+)捕獲的值坐桩,并將其存儲(chǔ)到topic_id中
模版
topics.html
{% extends "learning_logs/base.html" %} {% block content %}
<p>Topics</p>
<ul>
{% for topic in topics %}
<li>
<a href="{% url 'learning_logs:topic' topic.id %}">{{ topic }}</a>
</li>
{% empty %}
<li>No topics have been added yet.</li>
{% endfor %}
</ul>
{% endblock content %}
topic.html
{% extends 'learning_logs/base.html' %}
{% block content %}
<p>Topic: {{ topic }}</p>
<p>Entries:</p>
<ul>
{% for entry in entries %}
<li>
<p>{{ entry.date_added|date:'M d, Y H:i' }}</p>
<p>{{ entry.text|linebreaks }}</p>
</li>
{% empty %}
<li>
There are no entries for this topic yet.
</li>
{% endfor %}
</ul>
{% endblock content %}