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

###目錄:html

#1.簡介 ###MVCjava

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

###MVTpython

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

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

Django官方網站 Django官方文檔 安裝Django官方文檔介紹web

Django是一個基於MVC構造的框架。可是在Django中,控制器接受用戶輸入的部分由框架自行處理,因此 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),稱爲 MTV模式。正則表達式

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

BSD協議容許做者使用該協議下的資源,將其併入私人版本的軟件,該軟件可以使用閉源軟件協議發佈。數據庫

#2.環境搭建django

  1. 下載Ubuntu 鏡像文件 地址一 地址二 地址三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

  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

#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/

#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']
複製代碼
相關文章
相關標籤/搜索