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)站開發(fā)環(huán)境建立
概念
? 1、MVC(Model View Controller):Django 通過MVC概念把視圖和控制邏輯分割開來,讓程序設(shè)計人員可以盡量不用擔(dān)心網(wǎng)站通信協(xié)議的繁瑣細節(jié)而專心于要簡歷的網(wǎng)站功能。
? 2、virtuallenv設(shè)置管理python 的虛擬機環(huán)境
- pip install virtualenv
- virtualenv VENV
- source VENV/bin/activate
? 3、
第二課 Django網(wǎng)站快速入門
1、創(chuàng)建項目
#使用獨立的虛擬python 運行環(huán)境
(1)創(chuàng)建專用的文件夾: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 用來管理網(wǎng)站配置的文件,是一個接受命令行指令的工具程序,Django所有命令都是運行在此程序,平時不會修改它。
setting.py
? 是此網(wǎng)站的系統(tǒng)設(shè)置所在的位置,新創(chuàng)建的網(wǎng)站都要先打開這個文件,進行編輯設(shè)置的操作。真正的網(wǎng)站所有運行的邏輯都是在使用startapp 創(chuàng)建出來app文件中,使用這樣的方式是讓網(wǎng)站的每個主要功能都稱為一個單獨的模塊,方便網(wǎng)站的開發(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'
]
# 修改時區(qū)
LANGUAGE_CODE = 'zh-CN'
TIME_ZONE = 'Asia/shanghai'
USE_TZ = False
#修改訪問地址
ALLOWED_HOSTS = ['*']
urls.py
? 用來設(shè)置每一個URL的網(wǎng)址要對應(yīng)的函數(shù)以及對應(yīng)的方式
2、創(chuàng)建博客數(shù)據(jù)表
(1)數(shù)據(jù)庫與Django的關(guān)系
? 在默認情況下,Django的數(shù)據(jù)庫是以model的方式來操作的,也就是在程序中不直接面對數(shù)據(jù)庫以及數(shù)據(jù)表,而是以class類先創(chuàng)建好的model,然后通過對model的操作達到操作數(shù)據(jù)庫的目的。定義一個數(shù)據(jù)類來作為數(shù)據(jù)表,
(2)Django使用數(shù)據(jù)庫的操作步驟
- 在models.py中定義需要使用的類(繼承自models.Model)
- 詳細地設(shè)置每一個在類中的變量,即數(shù)據(jù)表中的每一個字段
- 使用python manage.py makemigrations APP_NAME 創(chuàng)建數(shù)據(jù)庫和Django間的中介文件
- 使用python manage.py migrate 同步更新數(shù)據(jù)庫的內(nèi)容
- 在程序中使用python 的方法操作所定義的數(shù)據(jù)類,等于是在操作數(shù)據(jù)庫中的數(shù)據(jù)表。
(3)定義數(shù)據(jù)類型
? 修改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)建一個類,到時會在數(shù)據(jù)庫中有一個對應(yīng)的數(shù)據(jù)表. title 用來顯示文檔的標(biāo)題,slug是文章的網(wǎng)址,body是文章的內(nèi)容,pub_date是發(fā)布的時間。
class Meta 內(nèi)的設(shè)置要指定文章顯示的順序是以pub_date為依據(jù)
__str__ 提供此類所產(chǎn)生的數(shù)據(jù)項
問題1、Django中的模塊
問題2、model.py 格式
問題3、Django如何連接mysql 之類的數(shù)據(jù)庫
django中ORM模型建立步驟
- 建立一張表(在數(shù)據(jù)庫中,手動)
- 在django中配置數(shù)據(jù)庫
- 新建app
- 將app添加到installed_apps列表中
- 寫模型(類的形式)
- 映射到數(shù)據(jù)庫中
(4)啟動admin管理界面
admin是Django默認的數(shù)據(jù)庫內(nèi)容管理界面。
- 創(chuàng)建管理員賬號和密碼: python manage.py createsuperuser
- 將mainsite/module.py中自定義的數(shù)據(jù)表加入admin,并通過admin.site.register()來設(shè)置注冊登錄
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
- 啟動: python manage.py runserver 0.0.0.0:8080 http://192.168.206.130:8080/admin
至51
一、Django 基礎(chǔ)介紹
1、Django特點
- 強大的數(shù)據(jù)庫功能 :數(shù)據(jù)庫操作接口QuerySet API,如需也能執(zhí)行原生SQL
- 自帶強大后臺:幾行簡單的代碼就能讓網(wǎng)站擁有強大的后臺
- 優(yōu)雅的網(wǎng)址:用正在匹配網(wǎng)址,傳遞到對應(yīng)函數(shù),隨意定義,如你所想
- 強大的模板系統(tǒng):
- 緩存系統(tǒng):可與redis,memcached等緩存系統(tǒng)聯(lián)用
- 國際化:支持多語言應(yīng)用
2、Django全貌
- urls.py:網(wǎng)址入口,關(guān)聯(lián)到對應(yīng)的views.py中的一個函數(shù)(或generic類),訪問網(wǎng)址就對應(yīng)一個函數(shù)
- views.py:處理用戶發(fā)出的請求,從urls.py中對應(yīng)過來,通過渲染templates中的網(wǎng)頁可以將顯示內(nèi)容,比如登錄后的用戶名,用戶請求的數(shù)據(jù),輸出到網(wǎng)頁
- models.py:與數(shù)據(jù)庫操作相關(guān),存入或去讀數(shù)據(jù)是用到
- forms.py:表單,用戶在瀏覽器上輸入數(shù)據(jù)提交,對數(shù)據(jù)的校驗工作以及輸入框的生成等工作
- templates文件夾:views.py中的函數(shù)渲染templates中的html模板,得到動態(tài)內(nèi)容的網(wǎng)頁,可以用緩存來提高速度
- admin.py:后臺
- settinspy:Django的設(shè)置,配置文件,比如DEBUG的開關(guān),靜態(tài)文件位置等
二、Django環(huán)境搭建
Django 2.0.x 支持 Python 3.4, 3.5 和 3.6 (最后一個支持 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 長期支持版本)
1、升級python版本
(1)環(huán)境準備
gcc gcc-c++庫安裝:yum install -y gcc gcc-c++
zlib zlib-devel 庫安裝: 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:進入項目目錄下,cd project_name然后執(zhí)行命令
python manage.py startapp app_name
或 django-admin.py startapp app_name
# 一般一個項目有多個app,通用的app也可以在多個項目中使用
- 創(chuàng)建數(shù)據(jù)庫表與更改
創(chuàng)建更改的文件:python manage.py makemigrations
生成的py文件應(yīng)用到數(shù)據(jù)庫:python manage.py migrate
這種方法可以在SQL等數(shù)據(jù)庫中創(chuàng)建與models.py代碼對應(yīng)的表,不需要自己手動執(zhí)行SQL
問題:django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17)
解決:更新sqlite版本
- 使用開發(fā)服務(wù)器
指定端口: python manage.py runserver PORT_NUM
監(jiān)聽機器所有可用的ip: python manage.py runserver 0.0.0.0:8000
問題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
問題2:運行django項目出現(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)建的項目里修改setting.py文件
ALLOWED_HOSTS = ['*'] #在這里請求的host添加了*
- 清空數(shù)據(jù)庫
python manage.py flush #此命令會詢問是 yes 還是 no, 選擇 yes 會把數(shù)據(jù)全部清空掉,只留下空表。
- 創(chuàng)建超級管理員
python manage.py createsuperuser #按照提示輸入用戶名和對應(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 項目終端 -- 熟練掌握
python manage.py shell
如果你安裝了 bpython 或 ipython 會自動用它們的界面,推薦安裝 bpython。
這個命令和 直接運行 python 或 bpython 進入 shell 的區(qū)別是:你可以在這個 shell 里面調(diào)用當(dāng)前項目的 models.py 中的 API,對于操作數(shù)據(jù),還有一些小測試非常方便
問題1: 安裝bpython
解決: pip3 install -i https://pypi.douban.com/simple/ bpython
- 數(shù)據(jù)庫命令行
python manage.py dbshell
- 更多命令
終端上輸入 python manage.py 可以看到詳細的列表,在忘記子名稱的時候特別有用。
四、Django 正式開始
1、Django 視圖與網(wǎng)址
Django中網(wǎng)址是寫在 urls.py 文件中,用正則表達式對應(yīng) views.py 中的一個函數(shù)(或者generic類)
(1)創(chuàng)建mysite項目
django-admin startproject mysit
mysite
├── manage.py
└── mysite
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
(2)新建一個應(yīng)用(app),名稱叫l(wèi)earn
python3 manage.py startapp learn
mysite中多一個learn文件夾
learn
├── __init__.py
├── admin.py 后臺相關(guān)的設(shè)置
├── apps.py app相關(guān)的設(shè)置文件
├── migrations 數(shù)據(jù)庫變更相關(guān)
│ └── __init__.py
├── models.py 數(shù)據(jù)庫模型相關(guān)
├── tests.py 單元測試
└── 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 就不能自動找到app中的模板文件(app-name/templates/下的文件)和靜態(tài)文件(app-name/static/中的文件)
(4)定義視圖函數(shù)(訪問頁面時的內(nèi)容)
我們在learn這個目錄中,把views.py打開,修改其中的源代碼,改成下面的
from django.http import HttpResponse
def index(request):
return HttpResponse("歡迎光臨 自強學(xué)堂!")
第一行引入HttpResponse,它是用來向網(wǎng)頁返回內(nèi)容的,就像Python中的 print 一樣,只不過 HttpResponse 是把內(nèi)容顯示到網(wǎng)頁上
我們定義了一個index()函數(shù),第一個參數(shù)必須是 request,與網(wǎng)頁發(fā)來的請求有關(guān),request 變量里面包含get或post的內(nèi)容,用戶瀏覽器,系統(tǒng)等信息在里面
函數(shù)返回了一個 HttpResponse 對象,可以經(jīng)過一些處理,最終顯示幾個字到網(wǎng)頁上
問題:那問題來了,我們訪問什么網(wǎng)址才能看到剛才寫的這個函數(shù)呢?怎么讓網(wǎng)址和函數(shù)關(guān)聯(lián)起來呢?
(5)定義視圖函數(shù)相關(guān)的URL(即規(guī)定 訪問什么網(wǎng)址對應(yīng)什么內(nèi)容)
打開 mysite/mysite/urls.py 這個文件, 修改其中的代碼:
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)頁上做加減法
- 采用/add/?a=4&b=5方式
創(chuàng)建project
創(chuàng)建app
將app加入到settings.py中
編寫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),
]
打開開發(fā)服務(wù)器訪問:python manage.py runserver 0.0.0.0:8001
http://192.168.206.130:8001/add/?a=4&b=5
- 采用/add/3/4
其他跟上面一樣
---------------------------------------------------------------
問題:path('add/', calc_views.add, name='add') 這里的name='add'是用來干什么的
簡單說,name 可以用于在 templates, models, views ……中得到對應(yīng)的網(wǎng)址,相當(dāng)于“給網(wǎng)址取了個名字”,只要這個名字不變,網(wǎng)址變了也能通過名字獲取到。
2、Django模板
? Django模板查找機制:Django查抄模板的過程式在每個app的templates文件中找(而不只是當(dāng)前app中的代碼只在當(dāng)前的app的templates文件中找)。各個app的templates形成一個文件夾列表,Django遍歷這個列表,一個個文件夾進行查找,當(dāng)在某個文件夾找到的時候就停止,所有都遍歷完了還找不到指定的模板的時候就會Template Not Found。
? Django模板中的循環(huán),條件判斷,常用的標(biāo)簽,過濾器:
(1)創(chuàng)建新項目
(2)在learn/views.py寫一個首頁的視圖
from django.shortcuts import render
def home(request):
return render(request, 'home.html')
(3)在 learn目錄下新建一個 templates 文件夾,里面新建一個 home.html
默認配置下,Django 的模板系統(tǒ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)編寫home.html
<!DOCTYPE html>
<html>
<head>
<title>歡迎光臨</title>
</head>
<body>
歡迎光臨自強學(xué)堂
</body>
</html>
(5)將視圖函數(shù)對應(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ù)庫表
python manage.py migrate
(7)網(wǎng)站模板的設(shè)計,可以寫一個base.html來包含這些通用模板.
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}默認標(biāo)題{% endblock %} - 自強學(xué)堂</title>
</head>
<body>
{% include 'nav.html' %}
{% block content %}
<div>這里是默認內(nèi)容,所有繼承自這個模板的,如果不覆蓋就顯示這里的默認內(nèi)容。</div>
{% endblock %}
{% include 'bottom.html' %}
{% include '#html' %}
</body>
</html>
- 如果需要,寫足夠的block({% block content %}<div> </div> {% endblock %})以便讓繼承的模板可以重寫該部分,include 是包含其它文件的內(nèi)容,就是把一些網(wǎng)頁共用的部分拿出來,重復(fù)利用