[toc]
1 安裝Django
1.1 Django版本與Python版本對應(yīng)關(guān)系
Django | Python
------ | ------
1.8 | 2.7, 3.2 (until the end of 2016), 3.3, 3.4, 3.5
1.9, 1.10 | 2.7, 3.4, 3.5
1.11 | 2.7, 3.4, 3.5, 3.6
2.0 | 3.4, 3.5, 3.6
2.1 | 3.5, 3.6, 3.7
1.2 安裝Django
安裝
pip install django==1.11.4
卸載
pip uninstall django
1.3 安裝驗(yàn)證
python
>>> import django
>>> django.get_version()
2 創(chuàng)建項(xiàng)目
在一個合適的位置創(chuàng)建目錄
使用終端進(jìn)入上一步創(chuàng)建的目錄下
執(zhí)行: django-admin startproject [project_name]
目錄層級說明:
project
manage.py 一個命令行工具,可以讓我我們使用多種方式對Django項(xiàng)目進(jìn)行操作
project目錄
__init__.py 一個空文件,告訴Python這個目錄應(yīng)該被看做一個Python包
settings.py 項(xiàng)目的配置文件
urls.py 項(xiàng)目的URL聲明,匹配view
wsgi.py 項(xiàng)目與WSGI兼容的Web服務(wù)器入口
3 基本操作
3.1 設(shè)計(jì)表結(jié)構(gòu)
學(xué)生庫
班級表結(jié)構(gòu)
表名 grade
字段
班級名稱 gname
成立時間 gdate
女生總數(shù) ggirlnum
男生總數(shù) gboynum
是否刪除 isDelete
學(xué)生表結(jié)構(gòu)
表名 students
字段
學(xué)生姓名 sname
學(xué)生性別 sgender
學(xué)生年齡 sage
學(xué)生簡介 scontend
所屬班級 sgrade
是否刪除 isDelete
3.2 配置數(shù)據(jù)庫
注意:Django 默認(rèn)使用sqlite3
在settings.py文件中,通過DATABASES進(jìn)行數(shù)據(jù)庫配置
配置MySQL
python3.x 安裝的是PyMySQL; python2.x 安裝的是mysql-python
在__init__.py寫入兩行代碼
import pymysql
pymysql.install_as_MySQLdb()
配置 settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'class',
'USER': 'root',
'PASSWORD': 'admin',
'HOST': '192.168.23.128',
'PORT': '3306',
}
}
3.3 創(chuàng)建應(yīng)用
在每個項(xiàng)目中可以創(chuàng)建多個應(yīng)用,每個應(yīng)用進(jìn)行一種業(yè)務(wù)處理;
打開終端,進(jìn)入項(xiàng)目目錄下;
執(zhí)行: python manage.py startapp myapp
myapp 目錄說明:
admin.py 站點(diǎn)配置
models.py 模型
views.py 視圖
3.4 激活應(yīng)用
在 settings.py 文件中,將myapp應(yīng)用加入到 INSTALLED_APPS 中;
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'myapp'
]
3.5 定義模型
概述: 有一個數(shù)據(jù)表,就對應(yīng)一個模型;
在 models.py 文件中定義模型:
引入 from django.db import models
模型要繼承 models.Model 類
class Grades(models.Model):
gname = models.CharField(max_length=20)
gdate = models.DateTimeField()
ggirlnum = models.IntegerField()
gboynum = models.IntegerField()
isDelete = models.BooleanField(default=False)
class Students(models.Model):
sname = models.CharField(max_length=20)
sgender = models.BooleanField(default=True)
sage = models.IntegerField()
scontend = models.TextField()
isDelete = models.BooleanField(default=False)
# 關(guān)聯(lián)外鍵
sgrade = models.ForeignKey('Crades')
說明:
不需要定義主鍵,在生成表時自動添加,并且值為自動增加;
一個表對應(yīng)一個模型類
一個類屬性對應(yīng)標(biāo)的一個字段
3.6 在數(shù)據(jù)庫中生成數(shù)據(jù)表
生成遷移文件
執(zhí)行: python manage.py makemigrations <appname>
遷移文件在:myapp/migrations/0001_inital.py
此時數(shù)據(jù)庫中還沒有生成數(shù)據(jù)表
執(zhí)行遷移:
執(zhí)行: python manage.py migrate <appname>
相當(dāng)于執(zhí)行 sql 語句創(chuàng)建數(shù)據(jù)表
備注:
帶上appname只會生成對應(yīng)app的數(shù)據(jù)表;
不帶,則會生成全部的數(shù)據(jù)表,包括一些系統(tǒng)的默認(rèn)表;
3.7 測試數(shù)據(jù)操作
進(jìn)入python shell,執(zhí)行: python manage.py shell
引入一些包
from myapp.models import Grands, Students
from django.utils import timezone
from datatime import *
查詢所有數(shù)據(jù)
類名.objects.all()
Grades.objects.all()
重寫 __str__方法,可以看到對象的值:
def __str__(self):
return '%s | %s | %s' % (self.gname, self.gdate, self.gnum)
添加數(shù)據(jù)
本質(zhì): 創(chuàng)建一個模型類的對象實(shí)例;
grade1 = Grades()
grade1.gname = 'python'
grade1.gdate = datetime(year=2018, month=2, day=14)
grade1.ggirlnum=3
grade1.gboynum=2
grade1.save()
查看某個對象
類名.objects.get(pk=2) pk == primary_key
修改數(shù)據(jù)
grade2 = Grades.objects.get(pk=2)
grade2.ggirlnum = 20
grade2.save()
刪除數(shù)據(jù)
grade2.delete()
注意:是物理刪除,數(shù)據(jù)庫中的表里的數(shù)據(jù)被刪除了;
關(guān)聯(lián)對象
grade1 = Grades.objects.get(pk=1)
stu = Students()
stu.sname = 'jane'
stu.sgender=False
stu.sage=18
stu.scontend= "i am jane."
stu.sgrade = grade1
stu.save()
獲取關(guān)聯(lián)對象的集合
需求:獲取 python 班所有學(xué)生
對象名.關(guān)聯(lián)的類名小寫_set.all()
grade1.students_set.all()
需求:給 python 班創(chuàng)建allen
stu3 = grade1.students_set.create(sname=u'allen', sgender=True, sage=30, scontend='i am allen.')
注意:不用調(diào)用save方法
3.8 啟動服務(wù)器
格式:
執(zhí)行:python manage.py runserver ip:port
ip 可以不寫,不寫代表localhost
port默認(rèn)8000
執(zhí)行:python manage.py runserver
說明:
這是純python寫的輕量級web服務(wù)器,只在測試開發(fā)時使用;
3.9 admin站點(diǎn)管理
概述:
內(nèi)容發(fā)布:
負(fù)責(zé)添加、修改、刪除內(nèi)容
公告訪問
配置admin應(yīng)用:
在 setting.py 文件的 INSTALLED_APPS 中添加 django.contrib.admin
創(chuàng)建管理員用戶:
執(zhí)行:python manage.py createsuperuser
一次輸入 用戶名、郵箱、密碼(8位,非字典密碼)
訪問:127.0.0.1:8000/admin
漢化:
修改 settings.py
LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
管理數(shù)據(jù)表:
修改 admin.py:
from .models import Grades, Students
# 注冊
admin.site.register(Grades)
admin.site.register(Students)
自定義管理頁面:(上面的注冊拋掉)
class GradesAdmin(admin.ModelAdmin):
# 列表頁屬性
list_display = ['pk', 'gname', 'gdate', 'gbnum', 'ggnum'] # 顯示表的字段(pk 是主鍵,也可以用字段名id)
list_filter = ['gname'] # 右側(cè)添加過濾字段欄,使用字段以及字段值來過濾數(shù)據(jù)
search_fields = ['gdate'] # 增加搜索框,定義哪些字段的值能夠搜索
list_per_page = 5 # 分頁,每頁顯示的數(shù)據(jù)數(shù)量
# 添加、修改頁的屬性 (注意 fields 和 fieldsets 不能同時使用)
fields = ['gname', 'gbnum', 'ggnum', 'gdate', 'isDelete'] # 屬性的先后順序:修改表單的顯示順序
fieldsets = [ # 給屬性分組
('Base', {"fields": ['sname', 'sgender', 'sage']}),
('Other', {"fields": ['sgrade', 'scontend', 'isDelete']})
]
admin.site.register(Grades, GradesAdmin)
關(guān)聯(lián)對象:
需求:在創(chuàng)建一個班級時,可以直接添加幾個學(xué)生;
class StudentsInfo(admin.TabularInline):
model = Students # 和 Students 模型關(guān)聯(lián)
extra = 2 # 創(chuàng)建班級時,添加兩個學(xué)生
# 注冊
class GradesAdmin(admin.ModelAdmin):
inlines = [StudentsInfo]
備注:
admin.TabularInline 把需要填寫的表單,放在一行顯示
admin.StackedInline 把需要填寫的表單,逐行顯示
boole值顯示問題:
class StudentsAdmin(admin.ModelAdmin):
def gender(self):
if self.sgender:
return '男'
else:
return '女'
# 設(shè)置頁面列的名稱
gender.short_description = '性別'
list_display = ['id', 'sname', 'sage', gender, 'scontend', 'sgrade']
列表標(biāo)題顯示問題:
age = lambda self: self.sage
age.short_description = '年齡'
list_display = ['id', 'sname', age, gender, 'scontend', 'sgrade']
執(zhí)行動作操作框位置:
actions_on_bottom = True
actions_on_top = False # 默認(rèn)是 True
使用裝飾器完成注冊
@ admin.register(Students)
class StudentsAdmin(admin.ModelAdmin):
...
...
# admin.site.register(Students, StudentsAdmin)
4 視圖的基本使用
4.1 概述
在 Django 中,視圖對web請求進(jìn)行回應(yīng);
視圖就是一個 python 函數(shù),在 views.py 中定義;
4.2 定義視圖
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse('Python is Best!')
4.3 配置url
修改 class(工程) 目錄下的 urls.py 文件
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('myapp.urls'))
]
在myapp應(yīng)用目錄下創(chuàng)建一個 urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index)
]
5 模板的基本使用
5.1 概述
模板是HTML頁面,可以根據(jù)視圖傳遞過來的數(shù)據(jù)進(jìn)行填充;
5.2 創(chuàng)建模板
創(chuàng)建 templates 目錄,在目錄下創(chuàng)建對應(yīng)模板目錄 class/templates/myapp
5.3 配置模板路徑
修改 settings.py 文件下 TEMPLATES, 把templates添加到DIRS中:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
5.4 定義模板
在 class/templates/myapp 下創(chuàng)建 grades.py 和 students.py
模板語法:
{{輸出值,可以是變量,也可以是對象.屬性}}
{%執(zhí)行代碼段%}
需求:http://127.0.0.1:8000/grades
編輯 grades.html 模板:
<h1>班級信息列表</h1>
<ul>
{% for grade in grages %}
<li>
<a href="#">{{ grade.gname }}</a>
</li>
{% endfor %}
</ul>
定義視圖:
from .models import Grades
def grades(requests):
# 去模板取數(shù)據(jù)
gradesList= Grades.objects.all()
# 將數(shù)據(jù)傳遞給模板,再渲染頁面,將渲染好的頁面返回給瀏覽器
return render(requests, 'myapp/grades.html', {'grades': gradesList})
# request參數(shù) 模板路徑 模板中接收的參數(shù)名: 傳遞的數(shù)據(jù)
配置url:
url(r'^grades/$', views.grades),
需求:http://127.0.0.1:8000/students
編輯 students.html 模板:
<h1>學(xué)生信息表</h1>
<ul>
{% for studentInfo in student %}
<li>
<a href="#">{{ studentInfo.id }}-{{ studentInfo.sname }}-{{ studentInfo.sage }}-{{ studentInfo.scontend }}</a>
</li>
{% endfor %}
</ul>
定義視圖:
def student(request):
studentList = Student.objects.all()
return render(request, 'myapp/student.html', {'student': studentList})
配置url:
url(r'^student/$', views.student),
需求:點(diǎn)擊班級顯示對應(yīng)學(xué)生信息
復(fù)用 students.html 模板
修改 grades.html 讓UAL傳參:
<a href="{{ gradeInfo.id }}">{{ gradeInfo.gname }}</a>
定義視圖:
def gradeStudent(request, num):
grade = Grade.objects.get(pk=num)
studentList = grade.student_set.all()
return render(request, 'myapp/student.html', {'student': studentList})
配置url:
url(r'^grade/(\d)$', views.gradeStudent),
需求:通過主頁分別訪問 grades students admin
編輯 index.html 模板:
<h2><a href="{{ 'admin' }}">admin</a></h2>
<h2><a href="{{ 'grade' }}">Grade</a></h2>
<h2><a href="{{ 'student' }}">Student</a></h2>
修改視圖:
def index(request):
return render(request, 'myapp/index.html')
配置url:
url(r'^$', views.index),