Django 學習
課程目標及內容
學些網址
課程目標
-
學習並掌握Django的基本語法
-
瞭解Django的部分原理以及各組件的額含義
-
可以獨立使用Django進行基本的網絡開發
課程內容
-
瞭解Django
-
搭建開發環境
-
完成一個簡單的個人博客網站
知識要求
-
掌握Python預研
-
瞭解HTML預研
-
瞭解瀏覽器上網的基本原理
課前準備
Django簡介
Django是一個基於Python的高級Web開發框架,開源
pip install Django==1.10.2
python -m django --version
瀏覽器基本原理
本質是網絡通信,即通過網絡進行數據傳遞,瀏覽器通過通信後獲取該頁面的源代碼文檔,然後解析後返回給頁面
Python 環境搭建
python
- 下載路徑:https://www.python.org/downloads/
- 系統: 64 、32
- 環境變量
django
- 下載路徑:https://www.djangoproject.com/download/
- python版本
- 安裝方式:pip、源碼安裝
開發工具
- Pycharm
- Sublime Text
- Atom
創建項目
創建步驟
進入想要創建項目的目錄
輸入: django-admin startproject myblog
項目目錄結構
目錄名稱不建議後期修改
wsgi.py
WSGI(Python Web Server Gateway Interface)
中文名: Python服務器網關接口
Python應用與Web服務器之間的接口
urls.py
URL配置文件
Django項目中所有頁面都需要配置URL
settings.py
項目配置總文件
BASE_DIR :項目根目錄
init.py
Python中聲明模塊
內容默認爲空
啓動命令
python manage.py runserver
python manage.py runserver 9999 # 修改端口號
創建應用
創建步驟
打開命令行,進入manage.py同級目錄
輸入: python manage.py startapp blog
添加應用名到 setting.py中的INSTALLED_APPS裏
目錄結構
migrations
數據移植模塊
admin.py
該應用的後臺管理系統配置
apps.py
該應用的一些配置
Django-1.9以後自動生成
models.py
數據模型模塊
使用ORM框架
類似MVC結構中的Models模塊
tests.py
自動化測試模塊
Django提供了自動化測試功能
在這裏編寫測試腳本
views.py
執行響應的邏輯代碼
代碼邏輯處理的主要地點
項目中大部分代碼在這裏編寫
創建一個響應(頁面)
編輯blog.views
每一個響應對應一個函數,函數必須返回一個響應
函數必須存在一個參數。一般約定爲request
每一個響應函數對應一個URL
編輯urls.py
每個URL都以url的形式寫出來
url函數存放在urlpatterns列表中
url函數三個參數:URL(正則),對應方法、名稱
創建Templates
配置URL(包含其他URL)
在根urls.py中引入include
在APP目錄下創建urls.py文件,格式與根urls.py相同
根urls.py中url函數的第二個參數改爲include(‘blog.urls’)
注意項
根url.py針對APP配置的URL名稱,是該APP所有URL的總路徑
配置URL時注意正則表達式結尾符號$和/
Templates
- HTML文件
- 使用了Django模板語言(Django TemplateLanguage,DTL)
- 可使用第三方模板(Jinja2)
- 修改模板:修改settings.py中的TEMPLATES.BACKEND
創建步驟
在APP的根目錄下創建Tempaltes目錄
在該目錄下創建HTML文件
在views.py中返回render()
DTL初步使用
- render()函數中支持一個dict類型參數
- 該字典是後臺傳遞到模板的參數,鍵爲參數名
- 在模板中使用{{參數名}}來直接使用
Django查找Template
- Django按照INSTALLED_APPS中的添加順序查找Templates
- 不同APP下Tempaltes目錄中的同名.html文件會衝突
- 解決方案:在APP的Tempaltes目錄下創建以APP爲名稱的目錄,將.html文件放入其中
Models
Models
- 一個Model對應數據庫的一張數據表
- Django中Models以類的形式表現
- 它包含一些基本字段以及數據的一些行爲
ORM
- 對象關係一映射(Object Relation Mapping)
- 實現了對象和數據庫之間的映射
- 隱藏了數據訪問細節,不需要編寫SQL語句
步驟
在應用根目錄下創建models.py,並引入models模塊
創建類,繼承models.Model,該類就是一張數據表
在類中創建字段
編寫Models
字段創建
字段即類裏面的屬性
attr = models.CharField(max_length=64)
htts://docs.djangoproject.com/en/1.10/ref/models/fields
生成數據表
進入目錄
python manage.py makemigrations app_name(可選)
python manage.py migrate
查看
Django會自動在app/migrations/目錄下生成移植文件
執行 python manage.py sqlmigrate 應用名 文件id 查看SQL語句
頁面呈現
views.py 中import models
models.Article.objects.all()
Admin
Admin
- Django自帶的一個功能強大的自動化數據管理界面
- 被授權的用戶可以直接在Admin中管理數據庫
- Django提供了許多針對Admin的定製功能
配置Admin
python manage.py createsuperuser 創建超級用戶
localhost:8000/adimn/ Admin入口
修改settings.py中LANGUAGE_CODE = 'zh_Hans' 修改頁面爲中文
配置應用
在應用下admmin.py中引入自身的models模塊
編輯admin.py:admin.site.register(Article)
修改數據默認顯示名稱
在Article類下添加一個方法
根據Python版本選擇 str(self)或 _unicode(self)
return self.title
博客開發
博客頁面設計
- 博客主頁面
- 博客文章內容頁面
- 博客撰寫頁面
博客主頁面
- 文章標題列表,超鏈接
- 發表博客按鈕,超鏈接
列表編寫思路
- 取出數據庫中所有文章對象
- 將文章對象打包成列表,傳遞到前端
- 前端頁面把文章標題以超鏈接的形式逐個列出
# 模板for循環
{% for xxx in xxs: %}
HTML語句
{% else: %}
HTML語句
{% endfor %}
博客文章內容頁面
- 標題
- 文章內容
- 修改文章按鈕(超鏈接)
添加響應函數 views.py
增加新的 html文件 Tempaltes/*.html
添加URL urls.py
超鏈接配置
href後面是目標地址
template中可以用“{% url ’app_name:url_name‘ param %}”
其中app_name和url_name都在url中配置
二級路由: app_name = ‘blog’
博客撰寫頁面
- 標題編輯欄
- 文章內容編輯區域
- 提交按鈕
編輯響應函數
使用request.Post[]
{% csrf_token %} post請求表單需要
修改數據
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
article.save()
補充內容
Templates過濾器
定義
- 寫在末班做,屬於Django模板語言
- 可以修改模板中的變量,從而顯示不同的內容
使用
<input type="hidden" name="article_id" value="{{ article.id | default:'0' }}"/>
更多過濾器
https://docs.djangoproject.com/en/1.10/ref/templates/builtins/#filter
Django Shell
定義
- 它是一個Python的交互式命令行程序
- 它自動引入了我們的項目環境
- 我們可以使用它與我們的項目進行交互
使用
python manage.py shell
from blogs.models import Article
Article.objects.all()
作用
- 使用Django Shell進行一些調試
- 測試未知的方法
Admin 增強
創建admin配置類
class ArticleAdmin(admin.ModelAdmin)
admin.site.register(Article, ArticleAdmin)
顯示其他字段
list_display = ('title', 'content', 'pub_time')
list_display同時支持tuple和list
過濾器
list_filter = ('pub_time', )