筆記來(lái)源:自強(qiáng)學(xué)堂-Django教程
這個(gè)教程真的非常好用!強(qiáng)烈推薦
Django簡(jiǎn)介-組成部分
- urls.py:網(wǎng)址入口,關(guān)聯(lián)到對(duì)應(yīng)的views.py中的一個(gè)函數(shù)(或者generic類),訪問(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ù)時(shí)用到這個(gè),用不到數(shù)據(jù)庫(kù)就不使用
- 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)。通過(guò)少量代碼就可以擁有一個(gè)強(qiáng)大的后臺(tái)。
- settings.py:Django的設(shè)置,配置文件。如DEBUG的開(kāi)關(guān),靜態(tài)文件的位置。
Django 基本命令
這些命令很重要,盡量記得
- 新建一個(gè)django project
django-admin.py startproject project-name
一個(gè)project為一個(gè)項(xiàng)目,project-name 項(xiàng)目名稱。
- 新建app
#執(zhí)行該命令:新建的app與project處于一個(gè)文件project下
django-admin.py startapp app-name
#執(zhí)行這個(gè)命令app在project-name子目錄下
#執(zhí)行這個(gè)命令的前提:cd projectname/
python manage.py startapp app-name
一般一個(gè)項(xiàng)目有多個(gè)app,通用的app可以在多個(gè)項(xiàng)目中使用
- 同步數(shù)據(jù)庫(kù)
#Django 1.7.1以及以上版本需要用一下命令
python manage.py makemigrations
python manage.py migrate
這種犯法可以創(chuàng)建表,當(dāng)在models.py中新增了類是,運(yùn)行它可以自動(dòng)的在數(shù)據(jù)庫(kù)中創(chuàng)建表,不用手動(dòng)創(chuàng)建。
-
使用開(kāi)發(fā)服務(wù)器
開(kāi)發(fā)服務(wù)器:開(kāi)發(fā)時(shí)使用,只用來(lái)測(cè)試,不要用于生產(chǎn)環(huán)境
python manage.py runserver
# 當(dāng)提示端口被占用的時(shí)候,可以用其它端口:
python manage.py runserver 8001
python manage.py runserver 9999
(當(dāng)然也可以kill掉占用端口的進(jìn)程)
# 監(jiān)聽(tīng)所有可用 ip (電腦可能有一個(gè)或多個(gè)內(nèi)網(wǎng)ip,一個(gè)或多個(gè)外網(wǎng)ip,即有多個(gè)ip地址)
python manage.py runserver 0.0.0.0:8000
# 如果是外網(wǎng)或者局域網(wǎng)電腦上可以用其它電腦查看開(kāi)發(fā)服務(wù)器
# 訪問(wèn)對(duì)應(yīng)的 ip加端口,比如 http://172.16.20.2:8000
- 清空數(shù)據(jù)庫(kù)
該命令執(zhí)行后只留下空表 - 創(chuàng)建超級(jí)管理員
python manage.py createsuperuser
# 按照提示輸入用戶名和對(duì)應(yīng)的密碼就好了郵箱可以留空,用戶名和密碼必填
# 修改 用戶密碼可以用:
python manage.py changepassword username
- 導(dǎo)出數(shù)據(jù)
#注意 導(dǎo)出的xxx.json文件位于 projectname文件夾下
python manage.py dumpdata appname > appname.json
python manage.py loaddata appname.json
- Django 項(xiàng)目環(huán)境終端
python mange.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è)試非常方便。
- 數(shù)據(jù)庫(kù)命令行
python manage.py dbshell
在這個(gè)終端可以執(zhí)行數(shù)據(jù)庫(kù)的SQL語(yǔ)句
- 更多命令
python manage.py
可以看到詳細(xì)列表,忘記命令時(shí)很好用
Django 視圖與網(wǎng)址
- 新建一個(gè)項(xiàng)目的基本步驟
#1. 新建一個(gè)項(xiàng)目(project), 名稱為 mysite
django-admin.py startproject mysite
#2. 新建一個(gè)應(yīng)用(app), 名稱叫 learn
#到外層那個(gè) mysite 目錄下(不是mysite中的mysite目錄)
python manage.py startapp learn
#**把我們新定義的app加到settings.py中的****INSTALL_APPS****中**
#修改 mysite/mysite/settings.py
#如果不添加這一步,django 就不能自動(dòng)找到app中的模板文件和靜態(tài)文件
#3. 定義視圖函數(shù)(訪問(wèn)頁(yè)面的內(nèi)容)
#在views.py中修改 注意:coding:utf-8
#4. 定義視圖函數(shù)相關(guān)的URL(網(wǎng)址)
# mysite/mysite/urls.py
#5. 運(yùn)行服務(wù)器
python manage.py runserver
- 其他功能
- 在網(wǎng)頁(yè)上做加減法
- 采用 **/add/?a=4&b=5 **這樣GET方法進(jìn)行
#views.py
from django.shortcuts import render
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))
#注:request.GET 類似于一個(gè)字典,更好的辦法是用 request.GET.get('a', 0) 當(dāng)沒(méi)有傳遞 a 的時(shí)候默認(rèn) a 為 0
#urls.py
from calc import views as calc_views
url(r'^add/', calc_views.add, name='add'), # 注意修改了這一行
#訪問(wèn)http://127.0.0.1:8000/add/?a=4&b=5
2. 采用/add/3/4/這樣的網(wǎng)址方式
#views.py
def add2(request,a,b):
c = int(a)+int(b)
return HttpResponse(str(c))
#urls.py
url(r'^add/(\d+)/(\d+)/$',calc_views.add2,name='add2')
#訪問(wèn)
http://127.0.0.1:8000/add/4/5/
- url中name的作用
當(dāng)網(wǎng)址發(fā)生改變的時(shí)候,訪問(wèn)能夠依然有效
不帶參數(shù)的:
{% url 'name' %}
帶參數(shù)的:參數(shù)可以是變量名
{% url 'name' 參數(shù) %}
例如:
<a href="{% url 'add2' 4 5 %}">link</a>
上述代碼渲染成的最終的頁(yè)面是:
<a href = "/add2/4/5">link</a>
#這樣就可以通過(guò) {% url 'add2' 4 5 %} 獲取到對(duì)應(yīng)的網(wǎng)址 /add2/4/5/
注意:注意看重點(diǎn) add2 變成了 new_add,但是后面的 name='add2' 沒(méi)改,這時(shí) {% url 'add2' 4 5 %} 就會(huì)渲染對(duì)應(yīng)的網(wǎng)址成 /new_add/4/5/
reverse 函數(shù)也是一樣,獲取的時(shí)候會(huì)跟著變成新的網(wǎng)址
讓以前的就網(wǎng)址自動(dòng)跳轉(zhuǎn)到新的網(wǎng)址:
#views.py
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
def old_add2_redirect(request, a, b):
return HttpResponseRedirect(
reverse('add2', args=(a, b))
)
#urls.py
url(r'^add2/(\d+)/(\d+)/$', calc_views.old_add2_redirect),
url(r'^new_add/(\d+)/(\d+)/$', calc_views.add2, name='add2'),
Django 模板
之前都是通過(guò)簡(jiǎn)單的django.http.HttpResponse把內(nèi)容顯示到網(wǎng)頁(yè)上,現(xiàn)在可以通過(guò)渲染模板的方式來(lái)顯示內(nèi)容。
- 基本步驟
#1.創(chuàng)建項(xiàng)目和應(yīng)用
django-admin.py startproject projectname
cd projectname
python manage.py startapp appname
#2.把應(yīng)用加入到settings.py INSTALLED_APPS當(dāng)中
#3.在appname/views.py 當(dāng)中寫(xiě)一個(gè)首頁(yè)的視圖
from django.shortcuts import render
def home(request):
home render(request,'home.html')
#4. 在appname下新建templates文件夾,里面新建一個(gè)home.html
#默認(rèn)配置下django會(huì)自動(dòng)找到app下面的templates文件夾中的模板文件
#5. 修改home.html
#6. 將視圖函數(shù)對(duì)應(yīng)到網(wǎng)址,更改projectname/urls.py
from appname import views as appname_views
urlpatterns = [
url(r'^$',appname_views.home,name='home'),
]
#7.創(chuàng)建數(shù)據(jù)庫(kù)表
python manage.py migrate
#8.運(yùn)行開(kāi)發(fā)服務(wù)器
python manage.py runserver
注意幾點(diǎn):
- 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í)候就是 Template Not Found (過(guò)程類似于Python找包)。
- 模板命名規(guī)則:僅和該app相關(guān)的模板放在 app/templates/app/
- 循環(huán)、條件判斷、常用標(biāo)簽、過(guò)濾器的使用
- 顯示一個(gè)基本的字符串在網(wǎng)頁(yè)上
#views.py
def home(request):
string = u'Hello world!'
return render(request,'home.html',{'string':string})
#home.html
{{ string }}
- 基本for循環(huán)和List內(nèi)容的顯示
- 顯示字典內(nèi)容
- for循環(huán)和if條件操作
- 模板中的邏輯操作
- 獲取當(dāng)前網(wǎng)址、當(dāng)前用戶