Django學(xué)習(xí)資源
https://code.ziqiangxuetang.com/learn_share/django-learn-resource.html
Django 2.x學(xué)習(xí)
第一篇
Python新手學(xué) Django 2.0 架構(gòu)的16堂課
第一課 網(wǎng)站開(kāi)發(fā)環(huán)境建立
概念
? 1、MVC(Model View Controller):Django 通過(guò)MVC概念把視圖和控制邏輯分割開(kāi)來(lái)傀履,讓程序設(shè)計(jì)人員可以盡量不用擔(dān)心網(wǎng)站通信協(xié)議的繁瑣細(xì)節(jié)而專(zhuān)心于要簡(jiǎn)歷的網(wǎng)站功能虱朵。
? 2、virtuallenv設(shè)置管理python 的虛擬機(jī)環(huán)境
- pip install virtualenv
- virtualenv VENV
- source VENV/bin/activate
? 3、
第二課 Django網(wǎng)站快速入門(mén)
1碴犬、創(chuàng)建項(xiàng)目
#使用獨(dú)立的虛擬python 運(yùn)行環(huán)境
(1)創(chuàng)建專(zhuān)用的文件夾:mkdir Django_mblog
(2)在此Django_mblog目錄下: source VENV/bin/activate
(3)安裝python Django環(huán)境:
(VENV)$ pip install django
(VENV)$ django-admin startproject mblog
(VENV)$ cd mblog
(VENV)$ git init
(VENV)$ git add .
(VENV)$ git commit -m 'first commit'
(VENV)$ git remote add origin https://YuanQiLvXi@bitbucket.org/YuanQiLvXi/mblog.git
(VENV)$ git push origin master
(VENV)$ python manage.py startapp mainsite
(VENV)$ python manage.py migrate
Django 文件夾與文件解析
manage.py
? manage.py 是Django 用來(lái)管理網(wǎng)站配置的文件絮宁,是一個(gè)接受命令行指令的工具程序,Django所有命令都是運(yùn)行在此程序翅敌,平時(shí)不會(huì)修改它羞福。
setting.py
? 是此網(wǎng)站的系統(tǒng)設(shè)置所在的位置惕蹄,新創(chuàng)建的網(wǎng)站都要先打開(kāi)這個(gè)文件蚯涮,進(jìn)行編輯設(shè)置的操作。真正的網(wǎng)站所有運(yùn)行的邏輯都是在使用startapp 創(chuàng)建出來(lái)app文件中卖陵,使用這樣的方式是讓網(wǎng)站的每個(gè)主要功能都稱為一個(gè)單獨(dú)的模塊遭顶,方便網(wǎng)站的開(kāi)發(fā)者在不同的網(wǎng)站中重復(fù)使用
# 添加創(chuàng)建的app模塊
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'APP_NAME'
]
# 修改時(shí)區(qū)
LANGUAGE_CODE = 'zh-CN'
TIME_ZONE = 'Asia/shanghai'
USE_TZ = False
#修改訪問(wèn)地址
ALLOWED_HOSTS = ['*']
urls.py
? 用來(lái)設(shè)置每一個(gè)URL的網(wǎng)址要對(duì)應(yīng)的函數(shù)以及對(duì)應(yīng)的方式
2、創(chuàng)建博客數(shù)據(jù)表
(1)數(shù)據(jù)庫(kù)與Django的關(guān)系
? 在默認(rèn)情況下泪蔫,Django的數(shù)據(jù)庫(kù)是以model的方式來(lái)操作的棒旗,也就是在程序中不直接面對(duì)數(shù)據(jù)庫(kù)以及數(shù)據(jù)表,而是以class類(lèi)先創(chuàng)建好的model撩荣,然后通過(guò)對(duì)model的操作達(dá)到操作數(shù)據(jù)庫(kù)的目的铣揉。定義一個(gè)數(shù)據(jù)類(lèi)來(lái)作為數(shù)據(jù)表,
(2)Django使用數(shù)據(jù)庫(kù)的操作步驟
- 在models.py中定義需要使用的類(lèi)(繼承自models.Model)
- 詳細(xì)地設(shè)置每一個(gè)在類(lèi)中的變量餐曹,即數(shù)據(jù)表中的每一個(gè)字段
- 使用python manage.py makemigrations APP_NAME 創(chuàng)建數(shù)據(jù)庫(kù)和Django間的中介文件
- 使用python manage.py migrate 同步更新數(shù)據(jù)庫(kù)的內(nèi)容
- 在程序中使用python 的方法操作所定義的數(shù)據(jù)類(lèi)逛拱,等于是在操作數(shù)據(jù)庫(kù)中的數(shù)據(jù)表。
(3)定義數(shù)據(jù)類(lèi)型
? 修改mainsite/models.py的內(nèi)容台猴,添加數(shù)據(jù)表
from django.db import models
from django.utils import timezone
# Create your models here.
class Post(models.Model):
title = models.CharField(max_length=200)
slug = models.CharField(max_length=200)
body = models.TextField()
pub_date = models.DateTimeField(default=timezone.now)
class Meta:
ordering = ('-pub_date',)
def __str__(self):
return self.title
在models.py中創(chuàng)建一個(gè)類(lèi)朽合,到時(shí)會(huì)在數(shù)據(jù)庫(kù)中有一個(gè)對(duì)應(yīng)的數(shù)據(jù)表. title 用來(lái)顯示文檔的標(biāo)題,slug是文章的網(wǎng)址饱狂,body是文章的內(nèi)容曹步,pub_date是發(fā)布的時(shí)間。
class Meta 內(nèi)的設(shè)置要指定文章顯示的順序是以pub_date為依據(jù)
__str__ 提供此類(lèi)所產(chǎn)生的數(shù)據(jù)項(xiàng)
問(wèn)題1休讳、Django中的模塊
問(wèn)題2讲婚、model.py 格式
問(wèn)題3、Django如何連接mysql 之類(lèi)的數(shù)據(jù)庫(kù)
django中ORM模型建立步驟
- 建立一張表(在數(shù)據(jù)庫(kù)中俊柔,手動(dòng))
- 在django中配置數(shù)據(jù)庫(kù)
- 新建app
- 將app添加到installed_apps列表中
- 寫(xiě)模型(類(lèi)的形式)
- 映射到數(shù)據(jù)庫(kù)中
(4)啟動(dòng)admin管理界面
admin是Django默認(rèn)的數(shù)據(jù)庫(kù)內(nèi)容管理界面竹捉。
- 創(chuàng)建管理員賬號(hào)和密碼: python manage.py createsuperuser
- 將mainsite/module.py中自定義的數(shù)據(jù)表加入admin,并通過(guò)admin.site.register()來(lái)設(shè)置注冊(cè)登錄
vim mainsite/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
admin.site.register(Post)
python manage.py makemigrations mainsite
python manage.py migrate
- 啟動(dòng): python manage.py runserver 0.0.0.0:8080 http://192.168.206.130:8080/admin
至51
一、Django 基礎(chǔ)介紹
1尚骄、Django特點(diǎn)
- 強(qiáng)大的數(shù)據(jù)庫(kù)功能 :數(shù)據(jù)庫(kù)操作接口QuerySet API块差,如需也能執(zhí)行原生SQL
- 自帶強(qiáng)大后臺(tái):幾行簡(jiǎn)單的代碼就能讓網(wǎng)站擁有強(qiáng)大的后臺(tái)
- 優(yōu)雅的網(wǎng)址:用正在匹配網(wǎng)址,傳遞到對(duì)應(yīng)函數(shù),隨意定義憨闰,如你所想
- 強(qiáng)大的模板系統(tǒng):
- 緩存系統(tǒng):可與redis状蜗,memcached等緩存系統(tǒng)聯(lián)用
- 國(guó)際化:支持多語(yǔ)言應(yīng)用
2、Django全貌
- urls.py:網(wǎng)址入口鹉动,關(guān)聯(lián)到對(duì)應(yīng)的views.py中的一個(gè)函數(shù)(或generic類(lèi))轧坎,訪問(wèn)網(wǎng)址就對(duì)應(yīng)一個(gè)函數(shù)
- views.py:處理用戶發(fā)出的請(qǐng)求,從urls.py中對(duì)應(yīng)過(guò)來(lái)泽示,通過(guò)渲染templates中的網(wǎng)頁(yè)可以將顯示內(nèi)容缸血,比如登錄后的用戶名,用戶請(qǐng)求的數(shù)據(jù)械筛,輸出到網(wǎng)頁(yè)
- models.py:與數(shù)據(jù)庫(kù)操作相關(guān)捎泻,存入或去讀數(shù)據(jù)是用到
- forms.py:表單,用戶在瀏覽器上輸入數(shù)據(jù)提交埋哟,對(duì)數(shù)據(jù)的校驗(yàn)工作以及輸入框的生成等工作
- templates文件夾:views.py中的函數(shù)渲染templates中的html模板笆豁,得到動(dòng)態(tài)內(nèi)容的網(wǎng)頁(yè),可以用緩存來(lái)提高速度
- admin.py:后臺(tái)
- settinspy:Django的設(shè)置赤赊,配置文件闯狱,比如DEBUG的開(kāi)關(guān),靜態(tài)文件位置等
二抛计、Django環(huán)境搭建
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (最后一個(gè)支持 Python 3.4 的版本)
Django 2.1.x 支持 Python 3.5, 3.6 和 3.7
Django 2.2.x 支持 Python 3.5, 3.6 和 3.7 (LTS 長(zhǎng)期支持版本)
1哄孤、升級(jí)python版本
(1)環(huán)境準(zhǔn)備
gcc gcc-c++庫(kù)安裝:yum install -y gcc gcc-c++
zlib zlib-devel 庫(kù)安裝: yum install -y zlib zlib-devel
(2)下載python 3.6 壓縮包
wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz
tar -zxf Python-3.6.6.tgz
(3)編譯安裝
cd Python-3.6.6
./configure --prefix=/usr/local/python3 --with-ssl
make && make install
(4)將/usr/bin下python 的軟連接 重新連接到python3
ln -fs python3 python
2 、安裝 pip
更新源 sudo yum -y install epel-release
安裝 sudo yum -y install python-pip python3-pip
更新到最新版本: sudo pip install --upgrade pip
3爷辱、安裝Django
pip3 install Django==2.2.7
檢查是否安裝成功:import django
django.get_version()
三录豺、Django 基本命令
- 新建Django project:django-admin.py startproject project_name
- 新建app:進(jìn)入項(xiàng)目目錄下,cd project_name然后執(zhí)行命令
python manage.py startapp app_name
或 django-admin.py startapp app_name
# 一般一個(gè)項(xiàng)目有多個(gè)app,通用的app也可以在多個(gè)項(xiàng)目中使用
- 創(chuàng)建數(shù)據(jù)庫(kù)表與更改
創(chuàng)建更改的文件:python manage.py makemigrations
生成的py文件應(yīng)用到數(shù)據(jù)庫(kù):python manage.py migrate
這種方法可以在SQL等數(shù)據(jù)庫(kù)中創(chuàng)建與models.py代碼對(duì)應(yīng)的表饭弓,不需要自己手動(dòng)執(zhí)行SQL
問(wèn)題:django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17)
解決:更新sqlite版本
- 使用開(kāi)發(fā)服務(wù)器
指定端口: python manage.py runserver PORT_NUM
監(jiān)聽(tīng)機(jī)器所有可用的ip: python manage.py runserver 0.0.0.0:8000
問(wèn)題1:You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.
解決:配置migrate:python manage.py migrate
問(wèn)題2:運(yùn)行django項(xiàng)目出現(xiàn)Invalid HTTP_HOST header: '192.168.1.111:8000'. You may need to add '192.168.1.111' to ALLOWED_HOSTS
解決:在我們創(chuàng)建的項(xiàng)目里修改setting.py文件
ALLOWED_HOSTS = ['*'] #在這里請(qǐng)求的host添加了*
- 清空數(shù)據(jù)庫(kù)
python manage.py flush #此命令會(huì)詢問(wèn)是 yes 還是 no, 選擇 yes 會(huì)把數(shù)據(jù)全部清空掉双饥,只留下空表。
- 創(chuàng)建超級(jí)管理員
python manage.py createsuperuser #按照提示輸入用戶名和對(duì)應(yīng)的密碼就好了郵箱可以留空弟断,用戶名和密碼必填
# 修改 用戶密碼可以用:
python manage.py changepassword username
- 導(dǎo)出數(shù)據(jù)與導(dǎo)入數(shù)據(jù)
導(dǎo)出數(shù)據(jù):python manage.py dumpdata appname > appname.json
導(dǎo)出數(shù)據(jù):python manage.py loaddata appname.json
- Django 項(xiàng)目終端 -- 熟練掌握
python manage.py shell
如果你安裝了 bpython 或 ipython 會(huì)自動(dòng)用它們的界面咏花,推薦安裝 bpython。
這個(gè)命令和 直接運(yùn)行 python 或 bpython 進(jìn)入 shell 的區(qū)別是:你可以在這個(gè) shell 里面調(diào)用當(dāng)前項(xiàng)目的 models.py 中的 API阀趴,對(duì)于操作數(shù)據(jù)昏翰,還有一些小測(cè)試非常方便
問(wèn)題1: 安裝bpython
解決: pip3 install -i https://pypi.douban.com/simple/ bpython
- 數(shù)據(jù)庫(kù)命令行
python manage.py dbshell
- 更多命令
終端上輸入 python manage.py 可以看到詳細(xì)的列表,在忘記子名稱的時(shí)候特別有用刘急。
四棚菊、Django 正式開(kāi)始
1、Django 視圖與網(wǎng)址
Django中網(wǎng)址是寫(xiě)在 urls.py 文件中叔汁,用正則表達(dá)式對(duì)應(yīng) views.py 中的一個(gè)函數(shù)(或者generic類(lèi))
(1)創(chuàng)建mysite項(xiàng)目
django-admin startproject mysit
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
(2)新建一個(gè)應(yīng)用(app),名稱叫l(wèi)earn
python3 manage.py startapp learn
mysite中多一個(gè)learn文件夾
learn
├── __init__.py
├── admin.py 后臺(tái)相關(guān)的設(shè)置
├── apps.py app相關(guān)的設(shè)置文件
├── migrations 數(shù)據(jù)庫(kù)變更相關(guān)
│ └── __init__.py
├── models.py 數(shù)據(jù)庫(kù)模型相關(guān)
├── tests.py 單元測(cè)試
└── views.py 視圖邏輯
(3)把新定義的app加到settings.py中的INSTALL_APPS中
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'learn', # 注意添加了這一行
]
新建的 app 如果不加到 INSTALL_APPS 中的話, django 就不能自動(dòng)找到app中的模板文件(app-name/templates/下的文件)和靜態(tài)文件(app-name/static/中的文件)
(4)定義視圖函數(shù)(訪問(wèn)頁(yè)面時(shí)的內(nèi)容)
我們?cè)趌earn這個(gè)目錄中,把views.py打開(kāi),修改其中的源代碼,改成下面的
from django.http import HttpResponse
def index(request):
return HttpResponse("歡迎光臨 自強(qiáng)學(xué)堂!")
第一行引入HttpResponse统求,它是用來(lái)向網(wǎng)頁(yè)返回內(nèi)容的检碗,就像Python中的 print 一樣,只不過(guò) HttpResponse 是把內(nèi)容顯示到網(wǎng)頁(yè)上
我們定義了一個(gè)index()函數(shù)码邻,第一個(gè)參數(shù)必須是 request折剃,與網(wǎng)頁(yè)發(fā)來(lái)的請(qǐng)求有關(guān),request 變量里面包含get或post的內(nèi)容像屋,用戶瀏覽器怕犁,系統(tǒng)等信息在里面
函數(shù)返回了一個(gè) HttpResponse 對(duì)象,可以經(jīng)過(guò)一些處理己莺,最終顯示幾個(gè)字到網(wǎng)頁(yè)上
問(wèn)題:那問(wèn)題來(lái)了奏甫,我們?cè)L問(wèn)什么網(wǎng)址才能看到剛才寫(xiě)的這個(gè)函數(shù)呢?怎么讓網(wǎng)址和函數(shù)關(guān)聯(lián)起來(lái)呢篇恒?
(5)定義視圖函數(shù)相關(guān)的URL(即規(guī)定 訪問(wèn)什么網(wǎng)址對(duì)應(yīng)什么內(nèi)容)
打開(kāi) mysite/mysite/urls.py 這個(gè)文件, 修改其中的代碼:
from django.contrib import admin
from django.urls import path
from learn import views as learn_views # new
urlpatterns = [
path("", learn_views.index), # new
path('admin/', admin.site.urls),
]
https://docs.djangoproject.com/en/2.2/topics/http/urls/
(6)在網(wǎng)頁(yè)上做加減法
- 采用/add/?a=4&b=5方式
創(chuàng)建project
創(chuàng)建app
將app加入到settings.py中
編寫(xiě)app目錄下的views.py
from django.http import HttpResponse
def add(request):
a = request.GET['a']
b = request.GET['b']
c = int(a)+int(b)
return HttpResponse(str(c))
在urls.py 中添加此views
from calc import views as calc_views
urlpatterns = [
url('^add/', calc_views.add, name='add'), # 注意修改了這一行
url('^admin/', admin.site.urls),
]
打開(kāi)開(kāi)發(fā)服務(wù)器訪問(wèn):python manage.py runserver 0.0.0.0:8001
http://192.168.206.130:8001/add/?a=4&b=5
- 采用/add/3/4
其他跟上面一樣
---------------------------------------------------------------
問(wèn)題:path('add/', calc_views.add, name='add') 這里的name='add'是用來(lái)干什么的
簡(jiǎn)單說(shuō)扶檐,name 可以用于在 templates, models, views ……中得到對(duì)應(yīng)的網(wǎng)址凶杖,相當(dāng)于“給網(wǎng)址取了個(gè)名字”胁艰,只要這個(gè)名字不變,網(wǎng)址變了也能通過(guò)名字獲取到智蝠。
2腾么、Django模板
? Django模板查找機(jī)制:Django查抄模板的過(guò)程式在每個(gè)app的templates文件中找(而不只是當(dāng)前app中的代碼只在當(dāng)前的app的templates文件中找)。各個(gè)app的templates形成一個(gè)文件夾列表杈湾,Django遍歷這個(gè)列表解虱,一個(gè)個(gè)文件夾進(jìn)行查找,當(dāng)在某個(gè)文件夾找到的時(shí)候就停止漆撞,所有都遍歷完了還找不到指定的模板的時(shí)候就會(huì)Template Not Found殴泰。
? Django模板中的循環(huán),條件判斷浮驳,常用的標(biāo)簽悍汛,過(guò)濾器:
(1)創(chuàng)建新項(xiàng)目
(2)在learn/views.py寫(xiě)一個(gè)首頁(yè)的視圖
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
(3)在 learn目錄下新建一個(gè) templates 文件夾,里面新建一個(gè) home.html
默認(rèn)配置下至会,Django 的模板系統(tǒng)會(huì)自動(dòng)找到app下面的templates文件夾中的模板文件离咐。
zqxt_tmpl
├── learn
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── migrations
│ │ └── __init__.py
│ ├── models.py
│ ├── templates
│ │ └── home.html
│ ├── tests.py
│ └── views.py
├── manage.py
└── zqxt_tmpl
├── __init__.py
├── __pycache__
│ ├── __init__.cpython-37.pyc
│ └── settings.cpython-37.pyc
├── settings.py
├── urls.py
└── wsgi.py
(4)編寫(xiě)home.html
<!DOCTYPE html>
<html>
<head>
<title>歡迎光臨</title>
</head>
<body>
歡迎光臨自強(qiáng)學(xué)堂
</body>
</html>
(5)將視圖函數(shù)對(duì)應(yīng)到網(wǎng)址。zqxt_tmpl/urls.py
from django.contrib import admin
from django.urls import path
from learn import views as learn_views # new
urlpatterns = [
path('', learn_views.home, name="home"), # new
path('admin/', admin.site.urls),
]
(6)創(chuàng)建數(shù)據(jù)庫(kù)表
python manage.py migrate
(7)網(wǎng)站模板的設(shè)計(jì)奉件,可以寫(xiě)一個(gè)base.html來(lái)包含這些通用模板.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默認(rèn)標(biāo)題{% endblock %} - 自強(qiáng)學(xué)堂</title>
</head>
<body>
{% include 'nav.html' %}
{% block content %}
<div>這里是默認(rèn)內(nèi)容宵蛀,所有繼承自這個(gè)模板的,如果不覆蓋就顯示這里的默認(rèn)內(nèi)容县貌。</div>
{% endblock %}
{% include 'bottom.html' %}
{% include '#html' %}
</body>
</html>
- 如果需要术陶,寫(xiě)足夠的block({% block content %}<div> </div> {% endblock %})以便讓繼承的模板可以重寫(xiě)該部分,include 是包含其它文件的內(nèi)容煤痕,就是把一些網(wǎng)頁(yè)共用的部分拿出來(lái)梧宫,重復(fù)利用