1. 程式人生 > >Django 入門(個人學習筆記,持續更新)

Django 入門(個人學習筆記,持續更新)

導語:這些筆記都是結合自己的學習和查詢網上的資料筆記或者回答上整理,可能有很多內容類似,目的是為了讓自己以後忘了知識點可以看自己寫的筆記,第一次寫技術筆記,多多包涵。

MVC

大部分開發語言中都有MVC框架
MVC框架的核心思想是:解耦
降低各功能模組之間的耦合性,方便變更,更容易重構程式碼,最大程度上實現程式碼的重用
m表示model,主要用於對資料庫層的封裝
v表示view,用於向用戶展示結果
c表示controller,是核心,用於處理請求、獲取資料、返回結果

MVT

Django是一款python的web開發框架
與MVC有所不同,屬於MVT框架
m表示model,負責與資料庫互動
v表示view,是核心,負責接收請求、獲取資料、返回結果
t表示template,負責呈現內容到瀏覽器

1.1搭建開發環境

我直接使用的是pycharm professional 也就是專業版,裡面直接選擇Django專案,會自動幫你安裝虛擬python環境用來進行開發,按alt+F12可以進入Terminal
pycharm-terminal

建立專案

命令

django-admin startproject test1

在上圖的terminal開啟輸入即可
進入test1目錄,目錄結構如下圖:
結構

目錄說明

manage.py:一個命令列工具,可以使你用多種方式對Django專案進行互動
內層的目錄:專案的真正的Python包
init .py:一個空檔案,它告訴Python這個目錄應該被看做一個Python包
settings.py:專案的配置
urls.py:專案的URL宣告
wsgi.py:專案與WSGI相容的Web伺服器入口

1.2設計模式

設計介紹

本示例完成“圖書-英雄”資訊的維護,需要儲存兩種資料:圖書、英雄
圖書表結構設計:
表名:BookInfo
圖書名稱:btitle
圖書釋出時間:bpub_date
英雄表結構設計:
表名:HeroInfo
英雄姓名:hname
英雄性別:hgender
英雄簡介:hcontent
所屬圖書:hbook
圖書-英雄的關係為一對多

資料庫配置

在settings.py檔案中,通過DATABASES項進行資料庫設定
django支援的資料庫包括:sqlite、mysql等主流資料庫
Django預設使用SQLite資料庫
建立應用

在一個專案中可以建立一到多個應用,每個應用進行一種業務處理
建立應用的命令:

python manage.py startapp booktest

應用的目錄結構如下圖,紅色的是後面出現的檔案,其他的是剛剛建立時候就存在的:
應用

定義模型類

  • 有一個數據表,就有一個模型類與之對應
  • 開啟models.py檔案,定義模型類
  • 引入包from django.db import models
  • 模型類繼承自models.Model類
  • 說明:不需要定義主鍵列,在生成時會自動新增,並且值為自動增長
  • 當輸出物件時,會呼叫物件的str方法
from django.db import models

# Create your models here.
class BookInfo(models.Model):
    btitle = models.CharField(max_length=20)
    bpub_date = models.DateTimeField()
    def ___str__(self):
        return "%d" % self.pk

class HeroInfo(models.Model):
    hname = models.CharField(max_length=20)
    hgender = models.BooleanField()
    hcontent = models.CharField(max_length=100)
    hBook = models.ForeignKey('BookInfo',on_delete=models.CASCADE,)
    def __str__(self):
        return "%d" % self.pk

需要注意的是,在Django2.0中,與之前的1.8不同,models下的ForeignKey()之前的版本是這樣寫的

hBook = models.ForeignKey('BookInfo')

這程式碼在Django2.0下執行會提示這樣的錯誤:

ypeError: __init__() missing 1 required positional argument: 'on_delete'  

所以在Django2.0中應該:

hBook = models.ForeignKey('BookInfo',on_delete=models.CASCADE,)

其中,on update cascade 和on delete cascade 作用區別:
這是資料庫外來鍵定義的一個可選項,用來設定當主鍵表中的被參考列的資料發生變化時,外來鍵表中響應欄位的變換規則的。update 則是主鍵表中被參考欄位的值更新,delete是指在主鍵表中刪除一條記錄:
on update 和 on delete 後面可以跟的詞語有四個
no action , set null , set default ,cascade
no action 表示 不做任何操作,
set null 表示在外來鍵表中將相應欄位設定為null
set default 表示設定為預設值
cascade 表示級聯操作,就是說,如果主鍵表中被參考欄位更新,外來鍵表中也更新,主鍵表中的記錄被刪除,外來鍵表中改行也相應刪除

生成資料表

  • 啟用模型:編輯settings.py檔案,將booktest應用加入到installed_appssettings
    ,以後專案中新的應用也要新增這裡中

  • 生成遷移檔案:根據模型類生成sql語句

python manage.py makemigrations
  • 遷移檔案被生成到應用的migrations目錄
    migration

  • 執行遷移:執行sql語句生成資料表

python manage.py migrate

測試資料操作

進入python shell,進行簡單的模型API練習

python manage.py shell

進入shell後提示如下:
shell
引入需要的包:

from booktest.models import BookInfo,HeroInfo
from django.utils import timezone
from datetime import *

查詢所有圖書資訊:

BookInfo.objects.all()

新建圖書資訊:

b = BookInfo()
b.btitle="射鵰英雄傳"
b.bpub_date=datetime(year=1990,month=1,day=10)
b.save()

查詢圖書資訊:

b=BookInfo.objects.get(pk=1)

輸出圖書資訊:

b
b.id
b.btitle

修改圖書資訊:

b.btitle=u"天龍八部"
b.save()

刪除圖書資訊:

b.delete()

1.3管理站點

伺服器

執行如下命令可以開啟伺服器

python manage.py runserver ip:port

可以不寫ip,預設埠為8000
這是一個純python編寫的輕量級web伺服器,僅在開發階段使用
伺服器成功啟動後,提示如下資訊
server
預設埠是8000,可以修改埠

python manage.py runserver 8080

開啟瀏覽器,輸入網址“127.0.0.1:8000”可以開啟預設頁面
如果修改檔案不需要重啟伺服器,如果增刪檔案需要重啟伺服器
通過ctrl+c停止伺服器

管理操作

站點分為“內容釋出”和“公共訪問”兩部分
“內容釋出”的部分負責新增、修改、刪除內容,開發這些重複的功能是一件單調乏味、缺乏創造力的工作。為此,Django會根據定義的模型類完全自動地生成管理模組

使用django的管理

建立一個管理員使用者
python manage.py createsuperuser,按提示輸入使用者名稱、郵箱、密碼
啟動伺服器,通過“127.0.0.1:8000/admin”訪問,輸入上面建立的使用者名稱、密碼完成登入
進入管理站點,預設可以對groups、users進行管理
管理介面本地化

編輯settings.py檔案,設定編碼、時區
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'

向admin註冊booktest的模型

開啟booktest/admin.py檔案,註冊模型
from django.contrib import admin
from models import BookInfo
admin.site.register(BookInfo)

重新整理管理頁面,可以對BookInfo的資料進行增刪改查操作
問題:如果在str方法中返回中文,在修改和新增時會報ascii的錯誤
解決:在str()方法中,將字串末尾新增“.encode(‘utf-8’)”
自定義管理頁面

Django提供了admin.ModelAdmin類
通過定義ModelAdmin的子類,來定義模型在Admin介面的顯示方式
class QuestionAdmin(admin.ModelAdmin):
...
admin.site.register(Question, QuestionAdmin)

列表頁屬性

list_display:顯示欄位,可以點選列頭進行排序
list_display = ['pk', 'btitle', 'bpub_date']
list_filter:過濾欄位,過濾框會出現在右側
list_filter = ['btitle']
search_fields:搜尋欄位,搜尋框會出現在上側
search_fields = ['btitle']
list_per_page:分頁,分頁框會出現在下側
list_per_page = 10
新增、修改頁屬性

fields:屬性的先後順序
fields = ['bpub_date', 'btitle']
fieldsets:屬性分組
fieldsets = [
('basic',{'fields': ['btitle']}),
('more', {'fields': ['bpub_date']}),
]

關聯物件

對於HeroInfo模型類,有兩種註冊方式

方式一:與BookInfo模型類相同
方式二:關聯註冊
按照BookInfor的註冊方式完成HeroInfo的註冊

接下來實現關聯註冊

from django.contrib import admin
from models import BookInfo,HeroInfo

class HeroInfoInline(admin.StackedInline):
    model = HeroInfo
    extra = 2

class BookInfoAdmin(admin.ModelAdmin):
    inlines = [HeroInfoInline]

admin.site.register(BookInfo, BookInfoAdmin)

可以將內嵌的方式改為表格
class HeroInfoInline(admin.TabularInline)
布林值的顯示

釋出性別的顯示不是一個直觀的結果,可以使用方法進行封裝

def gender(self):
    if self.hgender:
        return '男'
    else:
        return '女'
gender.short_description = '性別'

在admin註冊中使用gender代替hgender

    class HeroInfoAdmin(admin.ModelAdmin):
    list_display = ['id', 'hname', 'gender', 'hcontent']

完整程式碼:

from django.contrib import admin
from .models import *
# Register your models here.

class HeroInfoInline(admin.StackedInline):
    model = HeroInfo
    extra = 2

class BookInfoAdmin(admin.ModelAdmin):#要是想切換表格形式,引數引數改為TabularInline
    inlines = [HeroInfoInline]
    list_display = ['pk', 'btitle', 'bpub_date']
    list_filter = ['btitle']
    search_fields = ['btitle']
    list_per_page = 10

    fieldsets = [
        ('basic', {'fields': ['btitle']}),
        ('more', {'fields': ['bpub_date']}),
    ]


admin.site.register(BookInfo,BookInfoAdmin)
admin.site.register(HeroInfo)

1.4檢視

在django中,檢視對WEB請求進行迴應
檢視接收reqeust物件作為第一個引數,包含了請求的資訊
檢視就是一個Python函式,被定義在views.py中
這是多個步驟的寫法,更清楚過程:

#coding:utf-8
from django.http import HttpResponse

def index(request):
    return HttpResponse("index")
def detail(request,id):
    return HttpResponse("detail %s" % id)

更簡潔的,Django提供了函式Render()簡化檢視呼叫模板、構造上下文:

from django.shortcuts import render
from .models import BookInfo


def index(request):
    booklist = BookInfo.objects.all()
    return render(request,'booktest/index.html',{'booklist': booklist})

定義完成檢視後,需要配置urlconf,否則無法處理請求

URLconf

在Django中,定義URLconf包括正則表示式、檢視兩部分
Django使用正則表示式匹配請求的URL,一旦匹配成功,則呼叫應用的檢視
注意:只匹配路徑部分,即除去域名、引數後的字串
在test1/urls.py插入booktest,使主urlconf連線到booktest.urls模組

在django2.0之前,url是使用正正規規正則表示式,這樣一點都不Pythonic:

url(r'^', include('booktest.urls')),

從Django2.0開始,你可以這麼寫了:

path('',include('booktest.urls')),

在booktest中的urls.py中新增urlconf

from django.urls import path
from . import views
urlpatterns = [
    path('', views.index),
    path('<int:id>/',views.detail),
    #url(r'^([0-9]+)/$', views.detail),
]

引數叫id,型別是int

1.5模板

模板是html頁面,可以根據檢視中傳遞的資料填充值
建立模板的目錄如下圖:
template
修改settings.py檔案,設定TEMPLATES的DIRS值

'DIRS': [os.path.join(BASE_DIR, 'templates')],

在模板中訪問檢視傳遞的資料

{{輸出值,可以是變數,也可以是物件.屬性}}
{%執行程式碼段%}

定義index.html模板

<!DOCTYPE html>
<html>
<head>
  <title>首頁</title>
</head>
<body>
<h1>圖書列表</h1>
<ul>
{%for book in booklist%}
<li>
  <a href="{{book.id}}">
    {{book.btitle}}
  </a>
</li>
{%endfor%}
</ul>
</body>
</html>

定義detail.html模板
在模板中訪問物件成員時,都以屬性的方式訪問,即方法也不能加括號

<!DOCTYPE html>
<html>
<head>
  <title>詳細頁</title>
</head>
<body>
<h1>{{book.btitle}}</h1>
<ul>
  {%for hero in book.heroinfo_set.all%}
  <li>{{hero.hname}}---{{hero.hcontent}}</li>
  {%endfor%}
</ul>
</body>
</html>

使用模板

from django.shortcuts import render
from .models import BookInfo

# Create your views here.

def index(request):
    booklist = BookInfo.objects.all()
    return render(request,'booktest/index.html',{'booklist': booklist})
def detail(request,id):
    book = BookInfo.objects.get(pk=id)
    return render(request,'booktest/detail.html',{'book': book})

去除模板的硬編碼

在index.html模板中,超連結是硬編碼的,此時的請求地址為“127.0.0.1/1/”

<a href="{{book.id}}">

看如下情況:將urlconf中詳細頁改為如下,連結就找不到了

path('^book/([0-9]+)/$', views.detail),

此時的請求地址應該為“127.0.0.1/book/1/”
問題總結:如果在模板中地址硬編碼,將來urlconf修改後,地址將失效
解決:使用命名的url設定超連結
修改test1/urls.py檔案,在include中設定namespace

path('', include('booktest.urls', namespace='booktest')),

修改booktest/urls.py檔案,設定name,,在Django2.0中,需要加上app_name

app_name = 'booktest'
urlpatterns = [
    path('', views.index,name='index'),
    path('book/<int:id>/',views.detail,name='detail'),
    #url(r'^([0-9]+)/$', views.detail),
]

修改index.html模板中的連結

<a href="{%url 'booktest:detail' book.id%}">

相關推薦

Django 入門個人學習筆記持續更新

導語:這些筆記都是結合自己的學習和查詢網上的資料筆記或者回答上整理,可能有很多內容類似,目的是為了讓自己以後忘了知識點可以看自己寫的筆記,第一次寫技術筆記,多多包涵。 MVC 大部分開發語言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模

1SQL語句總結個人複習使用持續更新

瞭解sql語句之前需要了解一下什麼是資料庫。 一、資料庫DATABASE 簡稱(DB) 通俗來說,資料庫就是用來儲存和管理資料的倉庫。   資料庫的特點就是: 1持久化儲存資料,也就是直接把資料儲存到了硬碟的檔案中。 2用資料庫的目的就是方便資料的儲存和管理。

貝葉斯網路機器學習系列持續更新中~

在說貝葉斯規則(Bayes rule)和將貝葉斯規則用於圖模型之前,先讓大家瞭解下機器學習的四個正規化(paradigms),也可以理解為四個流派; 連線主義(connectionist):用現在比較流行的說法就是神經網路,現在用到的工具有Tensorflow

個人經常查閱的網站順序無先後持續更新

1. about雲 http://www.aboutyun.com/ 2. 極客學院的wiki http://wiki.jikexueyuan.com/ 3. github

網路流建圖的幾點體會給自己看的筆記持續更新

求大牛分享網路流題集與學習經驗,dp大牛要拍磚請去隔壁動態規劃筆記篇~~ 網路流建圖,實質是對實際問題的抽象。用一些圖論中的理論去模擬實際問題,然後再把解出的答案轉化為實際問題的答案。 限制通常體現在邊權上,實際意義什麼的可能體現在點上也可能體現在邊上。 網路流適用問題一:

再看紅樓未寫完持續更新

每次看紅樓,都有不一樣的感受。 最喜歡的角色 由林妹妹變成薛寶釵,又變回林妹妹。對林妹妹的如今的感受,竟是感同身受。   賈寶玉 從一開始覺得太過中央空調,到現在的能理解。   劉姥姥 從一開始的不喜歡,到現在的感動。   王熙鳳

在MacOS系統安裝homebrew2017年末版持續更新

中國網際網路上對於初學開發者實在是不太友好。百度會讓你搜出大量的重複內容,技術部落格大家一字不動抄來抄去——甚至不及媒體行業,至少人家知道抄之前改改(洗文);有些人為了沽名釣譽寫一些標題黨文章,對於解決問題毫無幫助;以及還存在問題解答方法由於版本更新失效的客觀問

300+篇運維、資料庫等實戰資料免費下載文章+PDF+視訊持續更新

2017年已過去一半,在此小編為大家精心整理了2017上半年熱點事件解析、實戰技術資料以及特別策劃短視訊系列,希望可以幫助大家更深入地回顧上半年的技術熱點,並儲備更充足的技術乾糧繼續2017的下一半。 PART 1 峰會回顧資料 餓了麼Redis Cluste

機器學習 吳恩達 課程筆記自用持續更新

機器學習 吳恩達 簡介 本筆記為自用筆記,因此只記錄了自己覺得重要的部分,所以不建議想要系統學習的人閱讀此筆記。 緒論 監督學習 我們給演算法一個數據集,其中包含了正確的答案,目的為給出更多的正確答案 “迴歸問題”:regression “分類問題”:cla

springboot學習個人學習筆記-4- 搭建ssm框架完成crud操作

宣告:寫此部落格是為了記錄個人技術學習的全過程,防止後期時間久了會有遺忘。希望同時也能幫到有需要的朋友一、建立springboot專案右鍵New-Spring Starter-Project選擇war包搜尋並新增依賴建立完成二、修改pom.xml,新增對jsp支援的依賴程式碼

讀入優化~~~個人學習筆記

false == 學習 學習筆記 筆記 scanf ios sca tchar 基本模板:inline int read(){ int x=0,w=1; char ch=0; while(ch<‘0‘ || ch>‘9‘){if(ch==‘-‘)w=-1;ch=

js 數組方法個人學習筆記

rev 了解 很多 com 過濾 接收參數 版本 push 操作數 首先,創建數組的兩個方法:   1.構造函數:  var array = new Array();//新建一個空數組 var array1 = new Array(20);//新建一個長度為20位的空數組

js 字符串方法個人學習筆記

new substring for name var 基本 正則表達 pattern 都是 首先,創建數組的兩個方法:   1.構造函數: var str = new String("a"); console.log(str);//"a"   2.字面量表示: var

js Math對象方法 個人學習筆記

最大 eof null alert XP source floor app math.sqrt 方法: 1.丟棄小數部分,保留整數部分 parseInt(5/2) 2.向上取整,有小數就整數部分加1 Math.ceil(5/2) 3,四舍五入.

JQ ajax全局事件 個人學習筆記

ron strong div sting UNC art append 屬性 res 作用:當你的頁面存在很多ajax事件的話,我們有一些信息是公共的,可以復用,我們可以用全局事件進行編寫,因為每一個ajax事件調用,都會觸發ajax全局事件。   jquery的ajax方

搭建Django環境實驗樓學習筆記

安裝 首先,我們要下載Django,編寫此課程時Django新版為2.0.6,為避免出現不必要的麻煩,請大家在實驗時也使用此版本。 開啟終端,輸入以下命令: $ sudo pip3 install Django==2.0.6 測試Django安裝 我們可以在終端中測試Djang

慕課網-Django入門與實踐-學習筆記

Detect languageAfrikaansAlbanianAmharicArabicArmenianAzerbaijaniBasqueBelarusianBengaliBosnianBulgarianCatalanCebuanoChichewaChinese (Simplified)Chinese

乾貨丨機器學習入門經典好文強烈推薦

讓我們從機器學習談起導讀:在本篇文章中,將對機器學習做個概要的介紹。本文的目的是能讓即便完全不瞭

各大機器學習包彙總python版持續更新

隨著機器學習的逐日升溫,各種相關開源包也是層出不群,面對如此多種類的工具包,該如何選擇,有的甚至還知之甚少或者不知呢,本文簡單彙總了一下當下使用比較多的Python版本機器學習工具包,供大家參看,還很不全不詳盡,會持續更新,也歡迎大家補充,多謝多謝!~~~ scik

Guava中關於字串處理以及加強版集合的使用記錄個人學習筆記

Guava中關於字串的處理 Strings工具類的使用 // 獲取共同的字首 String commonPrefix = Strings.commonPrefix("fenglang", "fengyue"); System.out.printl