編寫第一個(gè)Django應(yīng)用胯舷,第2部分

本文根據(jù)官方文檔在win10環(huán)境一步步學(xué)習(xí)python Django3.0基礎(chǔ)黎泣。
操作步驟較為詳細(xì),基礎(chǔ)原理最好觀看官方文檔

1.數(shù)據(jù)庫(kù)設(shè)置

如果沒(méi)有安裝mysql必尼,請(qǐng)點(diǎn)擊mysql5.7安裝文檔
1)登陸mysql蒋搜,創(chuàng)建以項(xiàng)目為名的數(shù)據(jù)庫(kù)名。

mysql -u root -p
輸入密碼123456
CREATE DATABASE mysite CHARACTER SET utf8;
exit
image.png

2)打開(kāi)mysite/settings.py判莉,替換掉DATABASES={}

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',  # 數(shù)據(jù)庫(kù)引擎
        'NAME': 'mysite',                      # 數(shù)據(jù)庫(kù)名稱
        'USER': 'root',                        # mysql用戶名
        'PASSWORD': '123456',                  # mysql用戶名對(duì)應(yīng)的密碼
        'HOST': '127.0.0.1',                   # mysql主機(jī)ip
        'PORT': '3306',                        # mysql端口
    }
}
LANGUAGE_CODE = 'zh-hans'    # en-us
TIME_ZONE = 'Asia/Shanghai'  # UTC
DEFAULT_CHARSET = 'utf-8'

3)初始化數(shù)據(jù)庫(kù)表
需要先安裝mysqlclient豆挽,否則報(bào)錯(cuò)如下,官方已不建議使用pymysql庫(kù)券盅。

不安裝直接初始化報(bào)錯(cuò)

pip install mysqlclient
安裝mysqlclient

python manage.py migrate
初始化后mysql新增表

2.創(chuàng)建模型

打開(kāi)polls/models.py

from django.db import models


class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')


class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)

3.激活模型

打開(kāi)mysite/settings.py

INSTALLED_APPS = [
    'polls.apps.PollsConfig',  # 新增
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

默認(rèn)情況下帮哈,INSTALLED_APPS包含以下應(yīng)用程序,所有這些應(yīng)用程序都隨Django一起提供:

通過(guò)運(yùn)行makemigrations氧腰,您將告訴Django您對(duì)模型進(jìn)行了一些更改
python manage.py makemigrations polls

image.png

查看將運(yùn)行哪種SQL枫浙。該 sqlmigrate命令采用遷移名稱并返回其SQL:

python manage.py sqlmigrate polls 0001

image.png

使用系統(tǒng)檢查框架來(lái)檢查整個(gè)Django項(xiàng)目中的常見(jiàn)問(wèn)題
python manage.py check
python manage.py migrate
image.png

migrate將數(shù)據(jù)庫(kù)狀態(tài)與當(dāng)前的模型和遷移集同步,可以在開(kāi)發(fā)項(xiàng)目時(shí)隨時(shí)間更改模型容贝,而無(wú)需刪除數(shù)據(jù)庫(kù)或表并創(chuàng)建新的模型-它專門用于實(shí)時(shí)升級(jí)數(shù)據(jù)庫(kù)而不會(huì)丟失數(shù)據(jù)自脯。
模型更改的三步指南:

4.練習(xí)

>>> from polls.models import Choice, Question  # 導(dǎo)入我們剛寫的模型類
>>> Question.objects.all() # 系統(tǒng)中還沒(méi)有問(wèn)題
<QuerySet []>
# 創(chuàng)造一個(gè)新問(wèn)題.
# 在默認(rèn)設(shè)置文件中啟用了對(duì)時(shí)區(qū)的支持,所以
# Django期望pub_date包含tzinfo的日期時(shí)間锻狗。使用timezone.now ()
# 而不是date .date .now()满力,它會(huì)做正確的事情
>>> from django.utils import timezone
>>> q = Question(question_text="What's new?", pub_date=timezone.now())
>>> q.save() # 將對(duì)象保存到數(shù)據(jù)庫(kù)中。您必須顯式地調(diào)用save().
>>> q.id     # 現(xiàn)在它有了一個(gè)ID.
1
>>> q.question_text # 通過(guò)Python屬性訪問(wèn)模型字段值.
"What's new?"
>>> q.pub_date
datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>)
>>> q.question_text = "What's up?" # 通過(guò)更改屬性來(lái)更改值轻纪,然后調(diào)用save()油额,才會(huì)保存到mysql,索引id不變刻帚。
>>> q.save()
>>> Question.objects.all()  # all()顯示數(shù)據(jù)庫(kù)中的所有問(wèn)題.
<QuerySet [<Question: Question object (1)>]>
mysql對(duì)應(yīng)的改變

更改polls/models.py

import datetime
from django.db import models
from django.utils import timezone

class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')
    def __str__(self):
        return self.question_text

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
        
class Choice(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    choice_text = models.CharField(max_length=200)
    votes = models.IntegerField(default=0)    

    def __str__(self):
        return self.choice_text

重新啟動(dòng)shellpython manage.py shell

>>> from polls.models import Choice, Question

# 確保我們的添加操作有效.
>>> Question.objects.all()
<QuerySet [<Question: What's up?>]>

# Django提供了一個(gè)完全由關(guān)鍵字參數(shù)驅(qū)動(dòng)的富數(shù)據(jù)庫(kù)查詢API
>>> Question.objects.filter(id=1)
<QuerySet [<Question: What's up?>]>
>>> Question.objects.filter(question_text__startswith='What')
<QuerySet [<Question: What's up?>]>

# 看看今年發(fā)表的問(wèn)題.
>>> from django.utils import timezone
>>> current_year = timezone.now().year
>>> Question.objects.get(pub_date__year=current_year)
<Question: What's up?>

# 請(qǐng)求一個(gè)不存在的ID潦嘶,這將引發(fā)異常。
>>> Question.objects.get(id=2)
Traceback (most recent call last):
    ...
DoesNotExist: Question matching query does not exist.

# 按主鍵查找是最常見(jiàn)的情況崇众,因此Django為主鍵精確查找提供了快捷方式掂僵。
# 以下內(nèi)容與question .object .get(id=1)相同。
>>> Question.objects.get(pk=1)
<Question: What's up?>

# 確保我們的自定義方法工作顷歌。
>>> q = Question.objects.get(pk=1)
>>> q.was_published_recently()
True

# 給問(wèn)題幾個(gè)選項(xiàng)锰蓬。create調(diào)用構(gòu)造一個(gè)新的選擇對(duì)象,執(zhí)行INSERT語(yǔ)句
# 將選擇添加到可用的選擇集合中眯漩,并返回新的選擇對(duì)象芹扭。Django創(chuàng)建一個(gè)集合來(lái)持有一個(gè)外鍵關(guān)系的“另一邊”
# (例如:問(wèn)題的選擇),并可透過(guò)應(yīng)用程式編程接口(API)查閱赦抖。
>>> q = Question.objects.get(pk=1)

# 顯示來(lái)自相關(guān)對(duì)象集的任何選項(xiàng)——目前還沒(méi)有舱卡。
>>> q.choice_set.all()
<QuerySet []>

# 創(chuàng)建三個(gè)選擇.
>>> q.choice_set.create(choice_text='Not much', votes=0)
<Choice: Not much>
>>> q.choice_set.create(choice_text='The sky', votes=0)
<Choice: The sky>
>>> c = q.choice_set.create(choice_text='Just hacking again', votes=0)
image.png
# 選擇對(duì)象具有對(duì)其相關(guān)問(wèn)題對(duì)象的API訪問(wèn)權(quán).
>>> c.question
<Question: What's up?>

# 反之亦然:問(wèn)題對(duì)象可以訪問(wèn)選擇對(duì)象.
>>> q.choice_set.all()
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>
>>> q.choice_set.count()
3

# API會(huì)根據(jù)您的需要自動(dòng)跟蹤關(guān)系。
# 使用雙下劃線分隔關(guān)系.
# 你想要多深就有多深;是沒(méi)有限制的.
# 找到所有的選擇任何問(wèn)題的出版日期是在今年
# (重用我們?cè)谏厦鎰?chuàng)建的'current_year'變量).
>>> Choice.objects.filter(question__pub_date__year=current_year)
<QuerySet [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]>

# 讓我們刪除其中一個(gè)選項(xiàng)队萤。為此使用delete().
>>> c = q.choice_set.filter(choice_text__startswith='Just hacking')
>>> c.delete()
刪除了choice中id為3

5.Django Admin簡(jiǎn)介

創(chuàng)建一個(gè)管理員用戶

python manage.py createsuperuser
Username: admin
Email address: admin@example.com
Password: **********
Password (again): *********
Superuser created successfully.

密碼驗(yàn)證選擇n灼狰,會(huì)進(jìn)行驗(yàn)證密碼,過(guò)于簡(jiǎn)單不予通過(guò)浮禾,選擇y直接跳過(guò)密碼驗(yàn)證交胚。
image.png

image.png

啟動(dòng)開(kāi)發(fā)服務(wù)器
$ python manage.py runserver
http://127.0.0.1:8000/admin/使用你創(chuàng)建的admin管理員及密碼登陸

image.png

您應(yīng)該看到幾種類型的可編輯內(nèi)容:組和用戶份汗。它們django.contrib.auth由Django 提供的身份驗(yàn)證框架提供。
image.png

我們的民意調(diào)查應(yīng)用程序在哪里蝴簇?它不會(huì)顯示在管理員索引頁(yè)面上杯活。
只需要做一件事:我們需要告訴管理員Question對(duì)象具有管理界面。為此熬词,請(qǐng)打開(kāi)polls/admin.py文件旁钧,然后將其編輯為如下所示:

from django.contrib import admin

from .models import Question

admin.site.register(Question)

重新刷新網(wǎng)頁(yè)Questions


image.png

點(diǎn)擊“問(wèn)題”。現(xiàn)在互拾,您在“更改列表”頁(yè)面上提問(wèn)歪今。此頁(yè)面顯示數(shù)據(jù)庫(kù)中的所有問(wèn)題,并允許您選擇一個(gè)更改它颜矿。有“怎么了寄猩?” 我們之前創(chuàng)建的問(wèn)題:


image.png

點(diǎn)擊“怎么了?” 編輯問(wèn)題:
image.png

繼續(xù)編輯時(shí)骑疆,點(diǎn)擊歷史可以查看所有歷史操作


image.png

這里要注意的事情:
  • 該表格是根據(jù)Question模型自動(dòng)生成的田篇。
  • 不同的模型字段類型(DateTimeFieldCharField)對(duì)應(yīng)于適當(dāng)?shù)腍TML輸入窗口小部件箍铭。每種類型的字段都知道如何在Django管理員中顯示自己泊柬。
  • 每個(gè)DateTimeField都有免費(fèi)的JavaScript快捷方式。日期具有“今天”快捷方式和日歷彈出窗口诈火,時(shí)間具有“現(xiàn)在”快捷方式和列出常用輸入時(shí)間的便捷彈出窗口兽赁。

頁(yè)面底部為您提供了兩個(gè)選項(xiàng):

  • 保存–保存更改并返回此對(duì)象類型的更改列表頁(yè)面。
  • 保存并繼續(xù)編輯–保存更改并重新加載該對(duì)象的管理頁(yè)面冷守。
  • 保存并添加另一個(gè)–保存更改并為此類型的對(duì)象加載新的空白表格刀崖。
  • 刪除–顯示刪除確認(rèn)頁(yè)面。

如果“發(fā)布日期”的值與在教程1中創(chuàng)建問(wèn)題的時(shí)間不匹配教沾,則可能意味著您忘記為該TIME_ZONE設(shè)置設(shè)置正確的值蒲跨。更改它,重新加載頁(yè)面并檢查是否顯示正確的值授翻。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末或悲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子堪唐,更是在濱河造成了極大的恐慌巡语,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淮菠,死亡現(xiàn)場(chǎng)離奇詭異男公,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)合陵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門枢赔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)澄阳,“玉大人,你說(shuō)我怎么就攤上這事踏拜∷橛” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵速梗,是天一觀的道長(zhǎng)肮塞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)姻锁,這世上最難降的妖魔是什么枕赵? 我笑而不...
    開(kāi)封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任仍源,我火速辦了婚禮剖张,結(jié)果婚禮上俱尼,老公的妹妹穿的比我還像新娘绷蹲。我一直安慰自己,他們只是感情好造垛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般弓熏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上糠睡,一...
    開(kāi)封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天挽鞠,我揣著相機(jī)與錄音,去河邊找鬼狈孔。 笑死信认,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的均抽。 我是一名探鬼主播嫁赏,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼油挥!你這毒婦竟也來(lái)了潦蝇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤深寥,失蹤者是張志新(化名)和其女友劉穎攘乒,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體惋鹅,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡则酝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闰集。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沽讹。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡般卑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出爽雄,到底是詐尸還是另有隱情椭微,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布盲链,位于F島的核電站蝇率,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏刽沾。R本人自食惡果不足惜本慕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侧漓。 院中可真熱鬧锅尘,春花似錦、人聲如沸布蔗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)纵揍。三九已至顿乒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泽谨,已是汗流浹背璧榄。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吧雹,地道東北人骨杂。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像雄卷,于是被迫代替她去往敵國(guó)和親搓蚪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

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