本文根據(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
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ù)券盅。
pip install mysqlclient
python manage.py migrate
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一起提供:
django.contrib.admin
–管理站點(diǎn)锰镀。您將很快使用它娘侍。django.contrib.auth
–認(rèn)證系統(tǒng)咖刃。django.contrib.contenttypes
–內(nèi)容類型的框架。django.contrib.sessions
–會(huì)話框架憾筏。django.contrib.messages
–消息傳遞框架嚎杨。django.contrib.staticfiles
–用于管理靜態(tài)文件的框架。
通過(guò)運(yùn)行makemigrations氧腰,您將告訴Django您對(duì)模型進(jìn)行了一些更改
python manage.py makemigrations polls
查看將運(yùn)行哪種SQL枫浙。該
sqlmigrate
命令采用遷移名稱并返回其SQL:
python manage.py sqlmigrate polls 0001
使用系統(tǒng)檢查框架來(lái)檢查整個(gè)Django項(xiàng)目中的常見(jiàn)問(wèn)題
python manage.py check
python manage.py migrate
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ù)自脯。
模型更改的三步指南:
- 更改模型(在中
models.py
)之景。- 運(yùn)行為這些更改創(chuàng)建遷移
python manage.py makemigrations
- 運(yùn)行以將那些更改應(yīng)用到數(shù)據(jù)庫(kù)斤富。
python manage.py migrate
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)>]>
更改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)
# 選擇對(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()
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)證交胚。啟動(dòng)開(kāi)發(fā)服務(wù)器
$ python manage.py runserver
http://127.0.0.1:8000/admin/使用你創(chuàng)建的admin管理員及密碼登陸
您應(yīng)該看到幾種類型的可編輯內(nèi)容:組和用戶份汗。它們
django.contrib.auth
由Django 提供的身份驗(yàn)證框架提供。我們的民意調(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
點(diǎn)擊“問(wèn)題”。現(xiàn)在互拾,您在“更改列表”頁(yè)面上提問(wèn)歪今。此頁(yè)面顯示數(shù)據(jù)庫(kù)中的所有問(wèn)題,并允許您選擇一個(gè)更改它颜矿。有“怎么了寄猩?” 我們之前創(chuàng)建的問(wèn)題:
點(diǎn)擊“怎么了?” 編輯問(wèn)題:
繼續(xù)編輯時(shí)骑疆,點(diǎn)擊歷史可以查看所有歷史操作
這里要注意的事情:
- 該表格是根據(jù)
Question
模型自動(dòng)生成的田篇。 - 不同的模型字段類型(
DateTimeField
,CharField
)對(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è)面并檢查是否顯示正確的值授翻。