Django教程(一) Django檢視與網址

一隻寫程式的猿發表於2018-01-12

###目錄:

#1.簡介 ###MVC

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

###MVT

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

Django 是用Python開發的一個免費開源的Web框架,可以用於快速搭建高效能,優雅的網站!

Django官方網站 Django官方文件 安裝Django官方文件介紹

Django是一個基於MVC構造的框架。但是在Django中,控制器接受使用者輸入的部分由框架自行處理,所以 Django 裡更關注的是模型(Model)、模板(Template)和檢視(Views),稱為 MTV模式。

BSD:BSD許可證是隨著加州大學伯克利分校釋出BSD UNIX發展起來的,修改版本被Apple、Apache所採用。BSD協議是“寬容自由軟體許可證”中的一員,在軟體複用上給予了最小限度的限制。

BSD協議允許作者使用該協議下的資源,將其併入私人版本的軟體,該軟體可使用閉源軟體協議釋出。

#2.環境搭建

  1. 下載Ubuntu 映象檔案 地址一 地址二 地址三

  2. 安裝ubuntu

  3. 安裝pip,使用以下合適的程式碼安裝

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install python-pip
複製程式碼

對於Python開發使用者來講,PIP安裝軟體包是家常便飯。但國外的源下載速度實在太慢,浪費時間,而且好多軟體總是被牆,所以把PIP安裝源替換成國內映象,可以大幅提升下載速度,還可以解決被牆導致的裝不上庫的煩惱,提高安裝成功率。網上有很多可用的源,這裡推薦的是清華大學的pip源,它是官網pypi的映象,每隔5分鐘同步一次。

Linux下,修改 ~/.pip/pip.conf (沒有就建立一個),按下Ctrl + H 可以看到隱藏檔案,修改 index-url至tuna,內容如下:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
複製程式碼

4.利用pip安裝 Django(推薦使用1.11版本)

(sudo)pip install Django
或者 (sudo) pip install Django==1.8.16 
或者 pip install Django==1.11
複製程式碼

檢查是否安裝成功

>>> import django
>>> django.VERSION
(1, 11, 'final', 0)
>>> 
>>> django.get_version()
'1.11'
複製程式碼

#3.安裝pycharm

  1. 下載JDK

    Django教程(一)  Django檢視與網址

  2. 解壓 輸入命令:tar zvxf jdk-8u131-linux-x64.tar.gz

  3. 建立jvm檔案 輸入命令:sudo mkdir /usr/lib/jvm

  4. 移動到/usr/lib/jvm下 輸入命令:sudo mv jdk1.8.0_131/ /usr/lib/jvm/ **注意:**如果沒有jvm檔案,執行該語句雖然會自動建立jvm檔案,但只會把jdk1.8.0_25裡面的檔案都放到jvm中,而不是把jdk1.8.0_25及其裡面的檔案放到jvm檔案中,兩者是有區別的

  5. 設定JDK環境變數 (也有在~/.bashrc修改的,區別是:/etc/profile的設定方法對所有登陸使用者都有效~/.bashrc只對當前使用者有效) 輸入命令:sudo vim ~/.profile 編輯:

export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_131
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
複製程式碼
  1. 使修改立刻生效source ~/.profile
  2. 驗證JDK 輸入命令:java -version
    Django教程(一)  Django檢視與網址

#4.Ubuntu下 正確安裝VMware Tools 為了實現可以從windows拖拽檔案到ubuntu,可以安裝VMware Tools

#5.Django主要模組

  • urls.py 網址入口,關聯到對應的views.py中的一個函式(或者generic類),訪問網址就對應一個函式。

  • views.py 處理使用者發出的請求,從urls.py中對應過來, 通過渲染templates中的網頁可以將顯示內容,比如登陸後的使用者名稱,使用者請求的資料,輸出到網頁。

  • models.py 與資料庫操作相關,存入或讀取資料時用到這個,當然用不到資料庫的時候 你可以不使用。

  • forms.py 表單,使用者在瀏覽器上輸入資料提交,對資料的驗證工作以及輸入框的生成等工作,當然你也可以不使用。

  • templates 資料夾 views.py 中的函式渲染templates中的Html模板,得到動態內容的網頁,當然可以用快取來提高速度。

  • admin.py 後臺,可以用很少量的程式碼就擁有一個強大的後臺。

  • settings.py Django 的設定,配置檔案,比如 DEBUG 的開關,靜態檔案的位置等。

#6.Django基本命令

  • 新建一個 django project
django-admin.py startproject project_name
特別是在 windows 上,如果報錯,嘗試用 django-admin 代替 django-admin.py 試試
複製程式碼

注意 project_name 是自己的專案名稱,需要為合法的 Python 包名,如不能為 1a 或 a-b。

  • 新建 app 要先進入專案目錄下,cd project_name 然後執行下面的命令(下同,已經在專案目錄下則不需要 cd project_name)
python manage.py startapp app_name
或 django-admin.py startapp app_name
複製程式碼

一般一個專案有多個app, 當然通用的app也可以在多個專案中使用。 與專案名類似 app name 也需要為合法的 Python 包名,如 blog,news, aboutus 等都是合法的 app 名稱。

  • 建立資料庫表 或 更改資料庫表或欄位
Django 1.7.1及以上 用以下命令
# 1. 建立更改的檔案
python manage.py makemigrations
# 2. 將生成的py檔案應用到資料庫
python manage.py migrate
 
 
舊版本的Django 1.6及以下用
python manage.py syncdb
複製程式碼

這種方法可以在SQL等資料庫中建立與models.py程式碼對應的表,不需要自己手動執行SQL。 備註:對已有的 models 進行修改,Django 1.7之前的版本的Django都是無法自動更改表結構的,不過有第三方工具 south

  • 使用開發伺服器 開發伺服器,即開發時使用,一般修改程式碼後會自動重啟,方便除錯和開發,但是由於效能問題,建議只用來測試,不要用在生產環境。
python manage.py runserver
 
# 當提示埠被佔用的時候,可以用其它埠:
python manage.py runserver 8001
python manage.py runserver 9999
(當然也可以kill掉佔用埠的程式)
 
# 監聽機器所有可用 ip (電腦可能有多個內網ip或多個外網ip)
python manage.py runserver 0.0.0.0:8000
# 如果是外網或者區域網電腦上可以用其它電腦檢視開發伺服器
# 訪問對應的 ip加埠,比如 http://172.16.20.2:8000
複製程式碼
  • 清空資料庫
python manage.py flush
複製程式碼

此命令會詢問是 yes 還是 no, 選擇 yes 會把資料全部清空掉,只留下空表。

  • 建立超級管理員
python manage.py createsuperuser
 
# 按照提示輸入使用者名稱和對應的密碼就好了郵箱可以留空,使用者名稱和密碼必填
 
# 修改 使用者密碼可以用:
python manage.py changepassword username
複製程式碼
  • Django 專案環境終端
python manage.py shell
複製程式碼

#7. Django檢視與網址 ###1.Django中網址是寫在 urls.py 檔案中,用正規表示式對應 views.py 中的一個函式(或者generic類)。

  1. 新建一個專案(project), 名稱為 zebk
django-admin startproject zebk
複製程式碼

備註: 如果 django-admin 不行,請用 django-admin.py 2. 新建一個應用(app), 名稱叫 zhong

python manage.py startapp zhong  # zhong 是一個app的名稱
複製程式碼
  1. 注:Django 1.8.x 以上的,還有一個 migrations 資料夾。Django 1.9.x 還會在 Django 1.8 的基礎上多出一個 apps.py 檔案。

把我們新定義的app加到settings.py中的INSTALL_APPS中 修改 mysite/mysite/settings.py

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
 
    'zhong',
)
複製程式碼

作用:新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動找到app中的模板檔案(app-name/templates/下的檔案)和靜態檔案(app-name/static/中的檔案)

###2.定義檢視函式(即訪問頁面時顯示的內容) 開啟/zebk下的views.py檔案 增加以下內容

# -*- coding: utf-8 -*- 
from django.http import HttpResponse
 
def index(request):
    return HttpResponse(u"hellow 中二病控丶!")
複製程式碼
  1. 第一行是宣告編碼為utf-8, 因為我們在程式碼中用到了中文,如果不宣告就報錯.
  2. 第二行引入HttpResponse,它是用來向網頁返回內容的,就像Python中的 print 一樣,只不過 HttpResponse 是把內容顯示到網頁上。
  3. 我們定義了一個index()函式,第一個引數必須是 request,與網頁發來的請求有關,request 變數裡面包含get或post的內容,使用者瀏覽器,系統等資訊在裡面(後面會講,先了解一下就可以)。
  4. 函式返回了一個 HttpResponse 物件,可以經過一些處理,最終顯示幾個字到網頁上。

###3. 定義檢視函式函式相關的URL

  1. 定義檢視函式相關的URL(網址)  (即規定 訪問什麼網址對應什麼內容) 開啟 mysite/mysite/urls.py 這個檔案, 修改其中的程式碼: 在mysite/urls.py,匯入django.conf.urls.include模組,並且新增到urlpatterns列表,所以mysite/urls.py如下:
# mysite/urls.py
from django.conf.urls import include, url
from django.contrib import admin

urlpatterns = [
    url(r'^zhong/', include('zhong.urls')),
    url(r'^admin/', admin.site.urls),
]
複製程式碼

2.在zhong中建立urls.py,編寫如下:

from django.conf.urls import url

from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]
複製程式碼

然後在終端上執行 python manage.py runserver 我們會看到類似下面的資訊:

 python manage.py runserver
 
Performing system checks...
 
System check identified no issues (0 silenced).
 
You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.
 
December 22, 2015 - 11:57:33
Django version 1.9, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
複製程式碼

開啟網頁,輸入127.0.0.1:8000/zhong/

Django教程(一)  Django檢視與網址

#8.管理操作

  • 站點分為“內容釋出”和“公共訪問”兩部分
  • “內容釋出”的部分負責新增、修改、刪除內容,開發這些重複的功能是一件單調乏味、缺乏創造力的工作。為此,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']
複製程式碼

相關文章