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