一、環境配置
(1)安裝python(3.6)
1.下載下傳安裝包: www.python.org/downloads/r…
2.Linux系統一般預設安裝Python2.7,如使用Python3.6自行編譯安裝
3.MacOS和Windows點選對應安裝包,進行"下一步"操作即可
(2)安裝pip
1. 下載下傳壓縮包:pypi.org/project/pip…
2. 解壓并進入目錄執行命名:
$ python setup.py install
3. 将
C:\Python36\Scripts;
添加至path環境變量,否則無法使用pip指令
4. cmd中輸入pip可檢視其幫助
(3)安裝django
1. 安裝
$ pip install django
2. 添加環境變量path
C:Python36\Lib\site-packages
3. 檢視django指令
$ django-admin help
如下圖說明安裝成功
二、建立項目及應用
(1)指令行建立項目,myapp為項目目錄名稱:
λ django-admin startproject myapp
建立成功時沒有任何提示如下圖,目前目錄内生成
myapp
目錄
(2)進入項目目錄 如下圖
(3)如圖,根目錄包含入口檔案
mange.py
和同名目錄
myapp/
(4)初始化目錄結構如上圖
-myapp : 項目根目錄
-myapp : 自動生成的同名子產品,存放項目配置檔案
__init__.py : 空檔案, 用來告訴python目前目錄是python子產品
settings.py : 包含項目所有配置參數
urls.py : URL根配置
wsgi.py : 内置runserver指令的WSGI相容的web伺服器入口
-manage.py : 應用的入口檔案複制代碼
(5)建立應用,一個應用編寫代碼開發一個業務子產品,booker為自定義應用名稱
λ python manage.py startapp booker
(6)如上圖 生成booker目錄
-myapp : 項目根目錄
-booker : 應用名稱(目錄)
-migrations : 資料遷移檔案目錄, 初始化時内部隻有一個空檔案 __init__.py
__init__.py : 告訴python目錄booker為一個python子產品
admin.py : 用于開發背景管理檔案
apps.py : 對應應用的setting設定,1.9版本後從settings.py分割出來.
models.py : 用于模型開發
tests.py : 用于單元測試
views.py : 用于視圖開發複制代碼
(7)将booker應用添加到
settings.py
檔案下
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'booker',
]複制代碼
(8)運作項目
λ python manage.py runserver 8080
, 端口預設為8000,
下圖紅色部分提示是因為有遷移檔案未執行遷移, 可執行
λ python manage.py migrate
生成表,也可等建立完模型類後一并執行.
三、建立模型類
項目是基于資料驅動,使用ORM操作将模型對象轉換為關系型資料庫
1. 打開應用的
models.py
定義兩個模型類
BookInfo
和
HeroInfo
from django.db import models
# Create your models here.
# 模型類若要與資料庫互動必須繼承于models.Model類
# 建立BookInfo模型類
# 定義字段屬性title, pub_date,類型分别為CharField和DateField并為字元串定義條件
class BookInfo(models.Model):
"""docstring for BookInfo"""
title = models.CharField(max_length=30)
pub_date = models.DateField()
def __str__(self):
return self.title
# 建立HeroInfo模型類
# 定義字段name,gender,skill,intro,book
# book定義為外鍵,關聯模型BookInfo,
# Django2.0+版本設定外鍵時需填寫on_delete參數否則報異常,參考<Django2.0關聯表必填on_delete參數>
class HeroInfo(models.Model):
"""docstring for HeroInfo"""
name = models.CharField(max_length=20)
gender = models.BooleanField(default=True)
skill = models.CharField(max_length=200)
intro = models.CharField(max_length=300)
book = models.ForeignKey('BookInfo', on_delete=models.CASCADE)
def __str__(self):
return self.name複制代碼
參考 : <Django2.0關聯表必填on_delete參數>
2 . 生成遷移檔案并執行遷移
指令行
λ python manage.py makemigrations
後左側項目内migrations目錄生成
0001_initial.py
遷移檔案
指令行
λ python manage.py migrate
生成db.sqlite3資料檔案
3. 到此資料模型類建立完畢 ,接下來可在django自帶的互動環境
λ python manage.py shell
操作資料,也可以跳到第四步登入背景進行操作, 以下是互動環境下簡單的資料庫操作
In [1]: from booker.models import BookInfo # 導入應用子產品
In [2]: BookInfo.objects.all() # 查詢所有
Out[2]: <QuerySet []> # 首次為空清單
In [3]: book = BookInfo() # 建立執行個體對象book
In [4]: book.title='笑傲江湖' # 添加屬性值
In [5]: from datetime import date # 導入時間子產品
In [6]: book.pub_date=date(1999,10,1) # 添加屬性值
In [7]: book.save() # 儲存對象
In [9]: BookInfo.objects.all() # 查詢所有資料
Out[9]: <QuerySet [<BookInfo: 笑傲江湖>]> # 顯示已添加資料, 如不顯示内容需在BookInfo模型中定義方法def __str__(self)
In [10]: BookInfo.objects.get(id=1) # 根據id擷取對象
Out[10]: <BookInfo: 笑傲江湖>
In [11]: book = BookInfo.objects.get(id=1) # 查找指定對象
In [12]: book.title = '倚天屠龍記' # 修改屬性值
In [13]: book.save() # 修改後需儲存
In [14]: BookInfo.objects.get(id=1) # 再次查詢
Out[14]: <BookInfo: 倚天屠龍記> # title已被修改
In [17]: book.delete() # 删除對象
Out[17]: (1, {'booker.HeroInfo': 0, 'booker.BookInfo': 1})
In [18]: BookInfo.objects.all()
Out[18]: <QuerySet []> # 删除後空清單
# HeroInfo資料庫操作類似,不同在于關聯部分, 與BookInfo關聯前需填充BookInfo資料
In [19]: from booker.models from HeroInfo # 導入HeroInfo模型
.... # 添加屬性值略
In [20]: book=BookInfo.objects.get(id=1) # book屬性定義為BookInfo清單指定對象
In [21]: book
Out[21]: <BookInfo: 倚天屠龍記>
In [22]: book.heroinfo_set.all() # 顯示book對象對應的heroinfo清單
Out[22]: [<HeroInfo: HeroInfo object>]複制代碼
四、背景管理
1 . 建立超級管理者賬号
λ python manage.py createsuperuser
:
賬号,郵箱,密碼,密碼确認
2 . 運作服務
λ python manage.py runserver 8080
輸入背景
http://127.0.0.1:8080/admin/
,
輸入賬号密碼登入背景.
3 . 改為中文界面,回到編輯器
myapp/myapp/settings.py
, 把紅線标記部分修改後重新整理背景頁面即可改成中文
LANGUAGE_CODE = 'zh-Hans' # 1.8版本後使用的中文
TIME_ZONE = 'Asia/Shanghai' # 中國時區
複制代碼
4 . 注冊模型類,并在背景顯示已建立的模型類
回到編輯器
myapp/booker/admin.py
, 編寫以下代碼後重新整理浏覽器
from django.contrib import admin
from booker.models import * # 引入模型類, 2.0版本根路徑基于myapp開始
# Register your models here.
# 2 .顯示模型類字段,并繼承admin.ModelAdmin子產品
class BookInfoAdmin(admin.ModelAdmin):
"""docstring for BookInfoAdmin"""
# 背景顯示的字段
list_display = ['id','title','pub_date']
class HeroInfoAdmin(admin.ModelAdmin):
"""docstring for HeroInfoAdmin"""
list_display = ['id','name','gender','skill','intro', 'book']
# 1. 注冊模型類
admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo,HeroInfoAdmin)
複制代碼
5 . 點選進入
Book infos
和
Hero infos
表進行CRUD操作, 注意低版本django進入修改可能會出現編碼錯誤提示
'UnicodeEncodeError'
, 原因是models中類定義的
def __str__(self)
方法傳回了中文, 需後面添加
.encode('utf-8')
五、建立視圖
1 . 在應用
booker/views.py
編寫視圖函數
from django.shortcuts import render
from django.http import HttpRequest
from booker.models import *
# Create your views here.
#HttpRequest
def index(request): # 函數名自定義,對應url路由
# HttpResponse
return HttpResponse('<h2>首頁</h2>')
複制代碼
2 . 配置url路由: 建立應用子路由
booker/urls.py
# 配置路由url
from django.urls import path
from booker import views
urlpatterns = [
path('',views.index), # 指向booker/views.py的index
]
複制代碼
3 . 将子路由子產品urls.py添加到項目
myapp/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls), # 舊版本可能使用url(),2.0推薦使用path()
path('',include('booker.urls')) # 指向booker/urls.py子產品, 2.0以上須使用include否則報異常
]
複制代碼
4 . 重新整理
http://127.0.0.1:8080/
顯示"首頁" , 路由通路的順序是:
manage.py-->myapp/settings.py-->myapp.urls.py-->booker/urls.py-->booker/views.py-->index-->模闆檔案
六、建立模闆
1 . 建立模闆
myapp/templates/booker/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h2>首頁</h2>
</body>
</html>
複制代碼
2. 修改之前建立的
booker/views.py
下的index方法,将return HttpResponse()改為return render()
#HttpRequest
def index(request):
# HttpResponse
# return HttpResponse('<h2>首頁</h2>') # 修改前
return render(request, 'booker/index.html') # 修改後
複制代碼
3 . 此時還需配置模闆檔案的根目錄, 進入
myapp/settings.py
'DIRS': [os.path.join(BASE_DIR, 'templates')],
4 . 重新整理浏覽器,模闆渲染成功,頁面顯示正常.
七、資料渲染
1 . 變量使用, 修改
booker/views.py
from django.shortcuts import render
from django.http import HttpResponse
from booker.models import * # 導入模型類
# Create your views here.
#HttpRequest
def index(request):
# HttpResponse
# return HttpResponse('<h2>首頁</h2>')
title = 'Django首頁' # 定義變量title
booklist = BookInfo.objects.all() # 定義變量booklist,從模型BookInfo擷取資料
context = { # 定義字典,儲存變量
'title': title,
'books': booklist
}
return render(request, 'booker/index.html', context) # render第三個參數傳入字典
複制代碼
2 . 模闆
booker/index.html
接收變量
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h2>首頁</h2>
<ul>
{% for book in books %}
<li><a href="/{{ book.id }}/">{{ book.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>
複制代碼
3 . 重新整理浏覽器,顯示背景BookInfo資料
4 . 添加詳情頁路由, 添加到
booker/urls.py
# 配置路由
from django.urls import path, re_path
from booker import views
urlpatterns = [
path('', views.index),
re_path('detail/(\d+)/',views.detail),
# 詳情頁路由,使用正則比對時應用re_path()方法
#正規表達式第一個()對應detail方法第二個參數,依次類推
]複制代碼
參考re_path() juejin.im/post/5aeed5…
5 . 修改模闆
booker/index.html
, 如路由中不使用detail字首則不用修改
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>{{ title }}</title>
</head>
<body>
<h2>首頁</h2>
<hr>
<ul>
{% for book in books %}
<li><a href="/detail/{{ book.id }}/">{{ book.title }}</a></li>
{% endfor %}
</ul>
</body>
</html>
複制代碼
6 .
booker/views.py
添加detail方法
def detail(request, id): # id為路由傳入的值
book = BookInfo.objects.get(id=id) # 根據id查找書名
heros = book.heroinfo_set.all() # 根據書名查找heros
context = {
'book': book,
'heros': heros
}
return render(request, 'booker/detail.html', context)
複制代碼
7 . 建立
booker/detail.html
模闆
<!DOCTYPE html>
<html hljs-string">"en">
<head>
<meta charset="UTF-8">
<title>{{ book.title }}</title>
</head>
<body>
<a href="/">傳回首頁</a>
<hr>
<h2>book詳情</h2>
<div>
<h3>書名: {{ book.title }}</h3>
<p>日期: {{ book.pub_date }}</p>
</div>
<div>
<h3>英雄清單</h3>
<ul>
{% for hero in heros %}
<li>
<div>姓名: {{ hero.name }}</div>
<div>性别:
{% if hero.gender == True%}
<span>男</span>
{% else %}
<span>女</span>
{% endif %}
</div>
<div>技能: {{ hero.skill }}</div>
<div>簡介: {{ hero.intro }}</div>
</li>
{% endfor %}
</ul>
</div>
</body>
</html>
複制代碼
8 . 回到浏覽器重新整理頁面, 點選清單即可進入詳情頁面
八、總結(思維導圖)