天天看點

Django架構開發web應用

一、環境配置

       (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 . 回到浏覽器重新整理頁面, 點選清單即可進入詳情頁面

八、總結(思維導圖)