5. PythonWeb應(yīng)用程序Django1

1.Django入門

  1. 準(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í)
  2. 建立虛擬環(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$
  1. 激活虛擬環(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$ 
  1. 安裝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$ 
  1. 在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)接口)的首字母縮寫。

  1. 創(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)匹配。

  1. 查看項(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)頁

image

關(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ù)

  1. 定義模型

    打開文件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())

  1. 激活模型

    使用模型撑帖,必須讓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)站

  1. 創(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)行比較

  1. 向管理網(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/

image

輸入剛才創(chuàng)建的超級(jí)用戶的用戶名和密碼
image

在這個(gè)網(wǎng)頁中趾娃,能夠添加和修改用戶和用戶組缭嫡,還可以管理與剛才定義的模型Topic相關(guān)的數(shù)據(jù)

添加主題

單機(jī)Topic進(jìn)入主題網(wǎng)頁,還沒有添加任何主題
image

點(diǎn)擊Add抬闷,在Text屬性輸入框輸入Chess妇蛀,保存(save)
image

在創(chuàng)建一個(gè)RockClimbing主題
image

  1. 定義模型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è)條目。

  1. 遷移模型ENtry

    命令同上Topic
python manage.py makemigrations learning_logs
  1. 向管理網(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è)條目

image
image

再添加一個(gè)
image

  1. 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,編寫視圖和編寫模版

  1. 映射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

  1. 編寫視圖肤舞,打開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
image
  1. 創(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) 部分的父模板

  1. 顯示所有主題的頁面

    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 %}

image


顯示特定主題的頁面

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 %}
image

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尺棋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子绵跷,更是在濱河造成了極大的恐慌膘螟,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碾局,死亡現(xiàn)場(chǎng)離奇詭異荆残,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)擦俐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門脊阴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來握侧,“玉大人蚯瞧,你說我怎么就攤上這事∑非妫” “怎么了埋合?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萄传。 經(jīng)常有香客問我甚颂,道長(zhǎng),這世上最難降的妖魔是什么秀菱? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任振诬,我火速辦了婚禮,結(jié)果婚禮上衍菱,老公的妹妹穿的比我還像新娘赶么。我一直安慰自己,他們只是感情好脊串,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布辫呻。 她就那樣靜靜地躺著清钥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪放闺。 梳的紋絲不亂的頭發(fā)上祟昭,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音怖侦,去河邊找鬼篡悟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛匾寝,可吹牛的內(nèi)容都是我干的恰力。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼旗吁,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼踩萎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起很钓,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤香府,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后码倦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體企孩,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年袁稽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勿璃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡推汽,死狀恐怖补疑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歹撒,我是刑警寧澤莲组,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站暖夭,受9級(jí)特大地震影響锹杈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜迈着,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一竭望、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧裕菠,春花似錦咬清、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽喻圃。三九已至,卻和暖如春粪滤,著一層夾襖步出監(jiān)牢的瞬間斧拍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工杖小, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肆汹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓予权,卻偏偏與公主長(zhǎng)得像昂勉,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子扫腺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 19.3 讓用戶擁有自己的數(shù)據(jù) 這一節(jié)岗照,我們將對(duì)一些頁面進(jìn)行限制,僅讓已登錄的用戶訪問它們笆环,我們還將確保每個(gè)主題都...
    Blue_Eye閱讀 677評(píng)論 0 1
  • 創(chuàng)建應(yīng)用程序 Django 項(xiàng)目由一系列應(yīng)用程序組成攒至,它們協(xié)同工作,讓項(xiàng)目成為一個(gè)整體躁劣。 startapp app...
    Blue_Eye閱讀 688評(píng)論 0 0
  • 18.3 創(chuàng)建網(wǎng)頁: 學(xué)習(xí)筆記主頁 使用Django創(chuàng)建網(wǎng)頁的過程通常分為三個(gè)階段: 定義URL迫吐、編寫視圖和編寫模...
    Blue_Eye閱讀 1,102評(píng)論 0 1
  • 19.1 讓用戶能夠輸入數(shù)據(jù) 19.1.1 添加新主題 創(chuàng)建基于表單的頁面的方法幾乎與前面創(chuàng)建網(wǎng)頁一樣: 定義UR...
    Blue_Eye閱讀 1,446評(píng)論 0 0
  • 第十八章 Django入門 一、建立項(xiàng)目 項(xiàng)目規(guī)范:項(xiàng)目規(guī)范詳細(xì)說明了項(xiàng)目的目標(biāo)账忘,闡述了項(xiàng)目的功能志膀,并討論了項(xiàng)目的...
    DKJImmy閱讀 2,152評(píng)論 1 49