python Web應(yīng)用程序1 2021-03-02

Django是一個(gè)web框架

在Django中創(chuàng)建項(xiàng)目:

#創(chuàng)建項(xiàng)目 末尾句點(diǎn)讓新項(xiàng)目使用合適的目錄結(jié)構(gòu)

PS C:\Users\hp\Desktop\learning_log> django-admin startproject learning_log .

#dir查看文件信息

PS C:\Users\hp\Desktop\learning_log> dir

? ? 目錄: C:\Users\hp\Desktop\learning_log

Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

d-----? ? ? ? 2021/3/1? ? 14:11? ? ? ? ? ? ? ? .vscode? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

d-----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? ? ? learning_log? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 690 manage.py? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

PS C:\Users\hp\Desktop\learning_log> dir learning_log

? ? 目錄: C:\Users\hp\Desktop\learning_log\learning_log

Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name

----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 417 asgi.py

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? 3200 settings.py? ? #指定Django如何與系統(tǒng)交互以及如何管理項(xiàng)目

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 775 urls.py? ? #應(yīng)該創(chuàng)建哪些頁(yè)面來(lái)響應(yīng)瀏覽器請(qǐng)求

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 417 wsgi.py? ? #幫助Django提供它創(chuàng)建的文件

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? ? 0 __init__.py

創(chuàng)建數(shù)據(jù)庫(kù):

#遷移migrate,首次執(zhí)行讓django確保數(shù)據(jù)庫(kù)與項(xiàng)目的當(dāng)前狀態(tài)匹配.使用SQLite中,首次將新建數(shù)據(jù)庫(kù)

PS C:\Users\hp\Desktop\learning_log> python manage.py migrate

Operations to perform:? ? #指出它將準(zhǔn)備好數(shù)據(jù)庫(kù),用于存儲(chǔ)執(zhí)行管理和身份驗(yàn)證任務(wù)所需的信息

? 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 admin.0003_logentry_add_action_flag_choices... 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 auth.0010_alter_group_name_max_length... OK

? Applying auth.0011_update_proxy_permissions... OK

? Applying auth.0012_alter_user_first_name_max_length... OK

? Applying sessions.0001_initial... OK


#SQLite是一種使用單個(gè)文件的數(shù)據(jù)庫(kù),是編寫(xiě)簡(jiǎn)單應(yīng)用程序的理想選擇,因?yàn)樗屇悴挥锰P(guān)注數(shù)據(jù)庫(kù)管理的問(wèn)題

PS C:\Users\hp\Desktop\learning_log> dir

? ? 目錄: C:\Users\hp\Desktop\learning_log

Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name

----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----

d-----? ? ? ? 2021/3/1? ? 14:11? ? ? ? ? ? ? ? .vscode

d-----? ? ? ? 2021/3/1? ? 14:33? ? ? ? ? ? ? ? learning_log

-a----? ? ? ? 2021/3/1? ? 14:33? ? ? ? 131072 db.sqlite3? ? #創(chuàng)建了一個(gè)文件db.sqlite3

-a----? ? ? ? 2021/3/1? ? 14:17? ? ? ? ? ? 690 manage.py


查看項(xiàng)目:

#使用命令runserver查看項(xiàng)目狀態(tài)

PS C:\Users\hp\Desktop\learning_log> python manage.py runserver

Watching for file changes with StatReloader

Performing system checks...

System check identified no issues (0 silenced).? ? #通過(guò)檢查確認(rèn)正確創(chuàng)建了項(xiàng)目

March 01, 2021 - 14:59:15

Django version 3.1.7, using settings 'learning_log.settings'? ? #指出Django的版本以及當(dāng)前使用的設(shè)置文件名稱(chēng)

Starting development server at http://127.0.0.1:8000/? ? #指出項(xiàng)目的URL 在當(dāng)前系統(tǒng)端口8000上偵聽(tīng)請(qǐng)求

Quit the server with CTRL-BREAK.


瀏覽器中輸入http://localhost:8000/:


一切正常

創(chuàng)建應(yīng)用程序:

PS C:\Users\hp\Desktop\learning_log> python manage.py startapp learning_logs? ? #新建learning_logs

PS C:\Users\hp\Desktop\learning_log> dir learning_logs

? ? 目錄: C:\Users\hp\Desktop\learning_log\learning_logs

Mode? ? ? ? ? ? ? ? LastWriteTime? ? ? ? Length Name

----? ? ? ? ? ? ? ? -------------? ? ? ? ------ ----

d-----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? ? ? migrations

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 66 admin.py

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 105 apps.py

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 60 models.py? ? #定義要在應(yīng)用程序中管理的數(shù)據(jù)

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 63 tests.py

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? 66 views.py

-a----? ? ? ? 2021/3/1? ? 15:39? ? ? ? ? ? ? 0 __init__.py


定義模型:

#每當(dāng)需要修改"學(xué)習(xí)筆記"管理的數(shù)據(jù)時(shí),都采取如下三個(gè)步驟:修改models.py,對(duì)learning_logs調(diào)用makemigrations,以及讓Django遷移項(xiàng)目

①創(chuàng)建/修改models.py

from?django.db?import?models

#?在這里創(chuàng)建模型

class?Topic(models.Model):??#?繼承Model

????'''用戶(hù)學(xué)習(xí)的主題'''

????#?text是一個(gè)由CharField--由字符串組成的數(shù)據(jù),即文本

????#?需要存儲(chǔ)少量文本,如名稱(chēng)、標(biāo)題或城市,預(yù)留200字符的空間

????text?=?models.CharField(max_length=200)

????#?是一個(gè)DateTimeField--記錄日期和時(shí)間的數(shù)據(jù)

????#?auto_now_add=True,每當(dāng)用戶(hù)創(chuàng)建新主題時(shí),Django會(huì)自動(dòng)設(shè)置為當(dāng)前日期和時(shí)間

????date_added?=?models.DateTimeField(auto_now_add=True)

????def?__str__(self):

????????'''返回模型的字符串表示'''

????????#?顯示主題的信息

????????return?self.text


激活模型:


learning_log中settings.py

將INSTALLED_APP修改成:

INSTALLED_APPS?=?[

????'learning_logs',

????#?默認(rèn)添加的應(yīng)用程序

????'django.contrib.admin',

????'django.contrib.auth',

????'django.contrib.contenttypes',

????'django.contrib.sessions',

????'django.contrib.messages',

????'django.contrib.staticfiles',

]

#接下來(lái)讓Django修改數(shù)據(jù)庫(kù),使其能夠存儲(chǔ)于模型Topic相關(guān)信息

②對(duì)learning_logs調(diào)用makemigrations

PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs

Migrations for 'learning_logs':

? learning_logs\migrations\0001_initial.py

? ? - Create model Topic

#命令makemigrations讓Django確定該如何修改數(shù)據(jù)庫(kù),使其能夠存儲(chǔ)與前面定義的新模型相關(guān)聯(lián)的數(shù)據(jù)

#輸出表明Django創(chuàng)建了一個(gè)名為0001_initial.py的遷移文件,這個(gè)文件將在數(shù)據(jù)庫(kù)中為模型Topic創(chuàng)建一個(gè)表

③Django遷移項(xiàng)目

#下面應(yīng)用這種遷移,讓Django替我們修改數(shù)據(jù)庫(kù)

PS C:\Users\hp\Desktop\1> python manage.py migrate

Operations to perform:

? Apply all migrations: admin, auth, contenttypes, learning_logs, sessions

Running migrations:

? Applying learning_logs.0001_initial... OK? ? #應(yīng)用遷移時(shí)正常



Django管理網(wǎng)站:

1.創(chuàng)建超級(jí)用戶(hù)

PS C:\Users\hp\Desktop\learning_log> python manage.py createsuperuser

Username (leave blank to use 'hp'): 11_admin

Email address: 349050532@qq.com

Password:

Password (again):

Error: Your passwords didn't match.

2.向管理網(wǎng)站注冊(cè)模型

#learning_logs中admin.py

from?django.contrib?import?admin

from?.models?import?Topic??#?導(dǎo)入要注冊(cè)的模型Topic

admin.site.register(Topic)??#?讓Django通過(guò)管理網(wǎng)站管理模型


登入網(wǎng)址http://localhost:8000/admin/login/?next=/admin/,輸入超級(jí)賬號(hào)

超級(jí)賬號(hào)


包含模型Topic的管理網(wǎng)站

3.添加主題


添加主題

定義模型Entry:

多對(duì)一關(guān)系:每個(gè)條目都與特定主題相關(guān)聯(lián),多個(gè)條目可關(guān)聯(lián)到同一個(gè)主題

from?django.db?import?models

#?在這里創(chuàng)建模型

class?Topic(models.Model):??#?繼承Model

????'''用戶(hù)學(xué)習(xí)的主題'''

????#?text是一個(gè)由CharField--由字符串組成的數(shù)據(jù),即文本

????#?需要存儲(chǔ)少量文本,如名稱(chēng)、標(biāo)題或城市,預(yù)留200字符的空間

????text?=?models.CharField(max_length=200)

????#?是一個(gè)DateTimeField--記錄日期和時(shí)間的數(shù)據(jù)

????#?auto_now_add=True,每當(dāng)用戶(hù)創(chuàng)建新主題時(shí),Django會(huì)自動(dòng)設(shè)置為當(dāng)前日期和時(shí)間

????date_added?=?models.DateTimeField(auto_now_add=True)

????def?__str__(self):

????????'''返回模型的字符串表示'''

????????#?顯示主題的信息

????????return?self.text

class?Entry(models.Model):

????'''學(xué)習(xí)的有關(guān)某個(gè)主題的具體知識(shí)'''

????#?外鍵,指向數(shù)據(jù)庫(kù)中的另一臺(tái)記錄,這里將每個(gè)條目關(guān)聯(lián)到特定主題

????#?創(chuàng)建主題時(shí),都分配了一個(gè)鍵(ID),需要在兩項(xiàng)數(shù)據(jù)之間建立聯(lián)系時(shí),使用相關(guān)聯(lián)鍵

????#on_delete=models.CASCADE在刪除主題的同時(shí)?刪除所有與之相關(guān)聯(lián)的條目,級(jí)聯(lián)刪除

????topic?=?models.ForeignKey(Topic,?on_delete=models.CASCADE)

????#字段長(zhǎng)度不受限制

????text?=?models.TextField()

????#按創(chuàng)建順序呈現(xiàn)條目,并在每個(gè)條目旁放置時(shí)間戳

????date_added?=?models.DateTimeField(auto_now_add=True)

????#Meta存儲(chǔ)用于管理模型的額外信息

????class?Meta:

????????#設(shè)置特殊屬性,讓Django在需要時(shí)使用Entries來(lái)表示多個(gè)條目

????????#如果沒(méi)有這個(gè)類(lèi),Django將使用Entrys來(lái)表示多個(gè)條目

????????verbose_name_plural?=?'entries'

????def?__str__(self):

????????'''返回模型的字符串表示'''

????????return?f"{self.text[:50]}..."

遷移模型:

PS C:\Users\hp\Desktop\learning_log> python manage.py makemigrations learning_logs

#生成新的遷移文件,告訴Django如何修改數(shù)據(jù)庫(kù),使其能夠存儲(chǔ)與模型Entry相關(guān)信息

Migrations for 'learning_logs':

? learning_logs\migrations\0002_entry.py? ??

? ? - Create model Entry

PS C:\Users\hp\Desktop\learning_log> python manage.py migrate? ?

Operations to perform:

? Apply all migrations: admin, auth, contenttypes, learning_logs, sessions

Running migrations:

? Applying learning_logs.0002_entry... OK? ? #遷移順利


向管理網(wǎng)站注冊(cè)Entry:

修改admin.py:

from?django.contrib?import?admin

from?.models?import?Topic,?Entry??#?導(dǎo)入要注冊(cè)的模型Topic,Entry

admin.site.register(Topic)??#?讓Django通過(guò)管理網(wǎng)站管理模型

admin.site.register(Entry)



描述


三個(gè)條目

Django shell:

#輸入數(shù)據(jù),通過(guò)交互式終端會(huì)話(huà)以編程方式查看這些數(shù)據(jù)

PS C:\Users\hp\Desktop\learning_log> python manage.py shell

Python 3.9.0 (tags/v3.9.0:9cf6752, Oct? 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

(InteractiveConsole)

>>> from learning_logs.models import Topic? ? #導(dǎo)入模塊Topic

>>> Topic.objects.all()? ? #獲取所有實(shí)例,這將返回一個(gè)查詢(xún)集(queryset)的列表

<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>


#可以像遍歷列表一樣遍歷查詢(xún)集,查看分配給每個(gè)主題對(duì)象的ID:

>>> from learning_logs.models import Topic

>>> Topic.objects.all()

<QuerySet [<Topic: Chess>, <Topic: Rock Climbing>]>

>>> topics = Topic.objects.all()

>>> for topic in topics:? ? ? ?

...? ? print(topic.id,topic)

...

1 Chess

2 Rock Climbing


#知道主題對(duì)象的ID后,就可使用方法Topic.objects.get()獲取該對(duì)象并查看其屬性

>>> t=Topic.objects.get(id=1)

>>> t.text

'Chess'

>>> t.date_added

datetime.datetime(2021, 3, 1, 8, 54, 20, 684484, tzinfo=<UTC>)


#查看相關(guān)聯(lián)的條目

>>> t.entry_set.all()

<QuerySet [<Entry: Chinese chess is a kind of chess game originated i...>, <Entry: Chess is mainly popular in

Chinese and countries w...>]>

#假如有模型Pizza,Topping.Topping通過(guò)外鍵關(guān)聯(lián)到Pizza,如果有一個(gè)名為my_pizza的Pizza對(duì)象,就可使用代碼my_pizza.topping_set.all()來(lái)獲取披薩的所有配料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容