本博客是記錄跟從慕課網(wǎng)課程所記下的筆記,更多內(nèi)容請(qǐng)?jiān)L問慕課網(wǎng)慕課網(wǎng)--項(xiàng)目源碼
新建項(xiàng)目
- 打開命令行,進(jìn)入到打算打算創(chuàng)建項(xiàng)目的目錄
- 輸入
django-admin startproject 項(xiàng)目名字,本例中取名為myBlog
分析項(xiàng)目文件

項(xiàng)目目錄.png
manager.py
與項(xiàng)目交互的命令行工具集入口
-
項(xiàng)目管理器
manager.py.png -
啟動(dòng)服務(wù)器runserver
python mange.py runserver
固定端口啟動(dòng)python mange.py runserver 端口號(hào)
runserver.png
項(xiàng)目同名目錄 myBlog
- 項(xiàng)目的一個(gè)容器
- 包含項(xiàng)目的最基本的配置
- 不建議修改
wsgi.py【Python服務(wù)器網(wǎng)管接口】
- Python應(yīng)用和與web服務(wù)器之間的接口
url.py
- URL配置我呢間
- Django項(xiàng)目的所有地址(頁面)都需要在此文件中進(jìn)行配置
settings.py
- 項(xiàng)目總配置文件
- 包含數(shù)據(jù)庫,web應(yīng)用,時(shí)間等各種配置
- BASE_DIR:項(xiàng)目根目錄
- SECRET_KEY:安全碼,項(xiàng)目啟動(dòng)所必須,會(huì)自動(dòng)配置好
- DEBUG: 是否是調(diào)試模式,生產(chǎn)環(huán)境要置為False
- ALLOWED_HOSTS: 主機(jī)名,限制訪問系統(tǒng)的主機(jī)地址
- INSTALLED_APPS:系統(tǒng)創(chuàng)建和自定義的應(yīng)用
- MIDDLEWARE: 中間件,簡(jiǎn)單理解為項(xiàng)目,項(xiàng)目自帶的工具集
- ROOT_URLCONF:URL的根文件,其默認(rèn)指向的就是url.py
- TEMPLATES: 模板文件,Django中模板就是HTML文件
- DATABASES:數(shù)據(jù)庫配置,默認(rèn)是其自帶的sqlite3,具體生產(chǎn)可以看Django官網(wǎng)對(duì)其他數(shù)據(jù)庫的配置要求
- STATIC_URL: 靜態(tài)文件地址
init.py
- 聲明模塊的文件,內(nèi)容可以為空
創(chuàng)建應(yīng)用
- 進(jìn)入 manage.py的同級(jí)目錄
python manage.py startapp 應(yīng)用名- 創(chuàng)建完成以后將應(yīng)用名添加到
setting.py的INSTALLED_APPS里 - 自己創(chuàng)建的應(yīng)用是不能和系統(tǒng)名字相同的
-
應(yīng)用下各模塊介紹
目錄.png- migrations: 數(shù)據(jù)移植模塊,其目錄下內(nèi)容都是系統(tǒng)生成的
- admin.py: 該應(yīng)用下的后臺(tái)管理系統(tǒng)配置
- app.py: 該應(yīng)用的一些配置,Django-1.9會(huì)自動(dòng)已生成,之前的版本沒有
- models: 數(shù)據(jù)模塊模塊,存放數(shù)據(jù)表,但是DJango有ORM框架,一般會(huì)配合其使用
- tests.py: 自動(dòng)化測(cè)試模塊,可以利用腳本進(jìn)行自動(dòng)化測(cè)試
- views.py: 視圖模塊,執(zhí)行相應(yīng)的代碼所以在的模塊,代碼邏輯處理的主要地點(diǎn),項(xiàng)目
大部分代碼均在這里編寫
創(chuàng)建響應(yīng)【在blog.views 模塊下】
- 引入頭文件
from django.http import HttpResponse - Django中每一個(gè)相應(yīng)都要通過一個(gè)函數(shù)處理,參數(shù)為請(qǐng)求,返回值為相應(yīng)
- 配置相應(yīng)的url
- 編輯urls.py
- url 函數(shù)放在urlpattens列表中
- url 函數(shù)參數(shù): URL(一般用政策表達(dá)式),url對(duì)應(yīng)的相應(yīng)函數(shù),url名稱(可選)
詳解url配置
- 方式1:
- 在views.py 中創(chuàng)建相應(yīng)函數(shù)
- 在系統(tǒng)應(yīng)用rls.py引入此函數(shù),并在urlpattens中配置此url
- 方式2:
- 在blog應(yīng)用新建urls.py文件
- 配置blog應(yīng)用下urls.py
- 導(dǎo)入頭文件
from django.conf.urls import url - 導(dǎo)入相應(yīng)views.py
- 新建urlpattens,并按照方式1中進(jìn)行url配置
- 導(dǎo)入頭文件
- 修改系統(tǒng)應(yīng)用下urls.py的頭文件
from django.conf.urls import url后面添加include,最終from django.conf.urls import url,include - 修改系統(tǒng)應(yīng)用urls.py模塊的urlpattens,
url(r'^index/',include("blog.urls")),
- tip:
- 配置url正則的時(shí)候,空串可以用"^$"
- 非空串在正則匹配之后,記得要加上反斜杠"^index/$"
創(chuàng)建Templates【模板】
- Django中
templates就是指HTML文件 - Django 要使用模板語言
DTL(Django Templates Language) - 模板引擎很多,本例中使用的jinjia2,要修改模板引擎,可以在
settings.py下TEMPLATES的BACKEND鍵值 - 具體步驟:
- 在當(dāng)前應(yīng)用(不是系統(tǒng)應(yīng)用)新建一個(gè)文件夾,名字是Templates
- 在Templates文件夾下新建HTML文件,如果項(xiàng)目存在多個(gè)應(yīng)用,那么在Tenplates下要新建一個(gè)與應(yīng)用同名的文件夾,然后將HTML文件創(chuàng)建在此目錄下
- 在views.py中相應(yīng)函數(shù)中,返回render渲染的HTML文件
- render 在views.py創(chuàng)建的過程中就已經(jīng)忍引入了
from django.shortcuts import render - render有很多參數(shù),比較常用的是: request,模板名稱.heml, 響應(yīng)給前端的數(shù)據(jù)
- render 在views.py創(chuàng)建的過程中就已經(jīng)忍引入了
- render函數(shù)支持一個(gè)字典參數(shù),key為傳遞給前臺(tái)的數(shù)據(jù)的key值,value就是傳遞的數(shù)值
創(chuàng)建Models
- Django中一個(gè)model對(duì)應(yīng)一張數(shù)據(jù)庫表,models以類的形式存在,所以處理數(shù)據(jù)不會(huì)與SQL打交道,是對(duì)對(duì)象進(jìn)行操作
- ORM : 對(duì)象關(guān)系映射,實(shí)現(xiàn)了對(duì)象和數(shù)據(jù)庫之間的映射,隱藏了數(shù)據(jù)訪問細(xì)節(jié),不編寫SQL語句
- 具體創(chuàng)建models
- 在應(yīng)用的根目錄下創(chuàng)建models.py,并引入models 模塊【系統(tǒng)在創(chuàng)建應(yīng)用的時(shí)候已經(jīng)做了】
- 創(chuàng)建類,繼承models.Model,該類就是一張數(shù)據(jù)表
- 類中創(chuàng)建數(shù)據(jù)表字段
- 字段即類中的屬性
- 格式
attr = models.數(shù)據(jù)類型(),
例如title = models.CharField(max_length=32,default='title')
更多數(shù)據(jù)類型請(qǐng)?jiān)L問這里
- 映射到數(shù)據(jù)表,即數(shù)據(jù)遷移
- 命令行進(jìn)入manage.py同一級(jí)目錄
- 執(zhí)行
Python manage.py makemigrations應(yīng)用名
如果不傳應(yīng)用名,會(huì)將該項(xiàng)目下所有的應(yīng)用制作數(shù)據(jù)遷移 - 執(zhí)行
python mange.py migrate - Django會(huì)自動(dòng)在
應(yīng)用/migrations/目錄下生成移至文件
- sql語句查看
python manage.py sqlmigrate 應(yīng)用名 文件id - 獲取數(shù)據(jù)庫中數(shù)據(jù)
-
views.py中引入import models - 獲取數(shù)據(jù)
article = models.Article.objects.get(參數(shù))
參數(shù)可以是具體條件而定,本例用使用主鍵作為參數(shù):
article = models.Article.objects.get(pk=1)
-
Admin
- Django 自帶的一個(gè)功能強(qiáng)大的
自動(dòng)化數(shù)據(jù)管理界面 - 被授權(quán)的用戶可以直接在Admin中
管理數(shù)據(jù)庫 - Django 提供了很多針對(duì)Admin的
定制功能 - 具體操作:
- 創(chuàng)建超級(jí)管理員
python manage.py createsuperuser - 通過
http://localhost:8000/admin/訪問后臺(tái)界面 - 修改界面為中文界面--修改
settings.py中`LANGUAGE_CODE = 'zh_Hans'
- 創(chuàng)建超級(jí)管理員
- 配置應(yīng)用下的admin.py
- 引入自身models模塊(或里面的模型類)
- 編輯admin.py : admin.site.register(models.Article)
- 修改系統(tǒng)數(shù)據(jù)的默認(rèn)顯示方式
- 在相應(yīng)的類下面添加一個(gè)方法
py3.x :__str__ (self):
py2.7 :__unicode__(self):
返回值為想要在后臺(tái)系統(tǒng)中展示的數(shù)據(jù),本例中是用的self.title
- 在相應(yīng)的類下面添加一個(gè)方法
博客主界面
- 主頁面內(nèi)容: 文章標(biāo)題列表(含有主鏈接),發(fā)表博客按鈕(含有超鏈接)
- 文章列表編寫思路:
- 取出數(shù)據(jù)庫中所有文章對(duì)象
- 修改views.py
articles = models.Article.objects.all()
- 修改views.py
- 文章打包成列表,傳遞給前端
- 將數(shù)據(jù)封裝為對(duì)象返回給前臺(tái)
return render(request,"blog/index.html", {"articles": articles})
- 將數(shù)據(jù)封裝為對(duì)象返回給前臺(tái)
- 前端頁面獲取到文章數(shù)據(jù),以標(biāo)題超鏈接的形式列出
- 在前端頁面遍歷數(shù)據(jù),格式為
{%for xx in xxs %}
- 在前端頁面遍歷數(shù)據(jù),格式為
- 取出數(shù)據(jù)庫中所有文章對(duì)象
博客文章頁面
-
思路:
- 標(biāo)題
- 文章內(nèi)容
- 修改文章按鈕(超鏈接)
添加響應(yīng)函數(shù)函數(shù),為了獲取具體的文章,要將代表文章的參數(shù)(本例中選擇id)傳入
def article_page(request,article_id):
article = models.Article.objects.get(pk=article_id)
return render(request,"blog/article_page.html",{"article":article})
- 創(chuàng)建HTML模板,展示標(biāo)題和內(nèi)容
<body>
<h1>{{article.title}}</h1>
<br>
<h3>{{article.content}}</h3>
<br>
<br>
<a href="">修改文章</a>
</body>
- urls.py配置url:
- 整體思路:在遺忘配置的url的鏈接后邊追加文章的Id
- 具體實(shí)現(xiàn):
url(r'^article/(?P<article_id>[0-9]+)$',bv.article_page)
其中(?P<article_id>[0-9]+)中article_id要和響應(yīng)函數(shù)中的文字Id的參數(shù)名保持一致
博客主頁面鏈接到文章頁面
-
超鏈接目標(biāo)地址,即a標(biāo)簽的href屬性后邊的鏈接地址,在Django中有固定的寫法
{%url "app_name : url_naeme" param %}- app_name: 應(yīng)用的命名空間
- url_name:url鏈接名
- param: 參數(shù)
- {%url ....%} 是固定的寫法
- 注意字符串
*具體寫法 - 再言u(píng)rl的配置---url的第三個(gè)參數(shù)(在有inclue的情況下就是第二個(gè)參數(shù)),寫法有兩種:
- 寫法1:在有include的情況下,include的第2個(gè)參數(shù)為定位
namespace="應(yīng)用的命名空間" - 寫法2:在沒有include的情況下,第3個(gè)參數(shù)為
name = "應(yīng)用的命名空間"
- 寫法1:在有include的情況下,include的第2個(gè)參數(shù)為定位
配置的這兩個(gè)名字就是url_name的值
app_name取的是系統(tǒng)應(yīng)用下的url配置的命名空間
以上兩個(gè)名字可以隨便定義,沒有固定的要求
博客撰寫頁面
- 思路
- 頁面:標(biāo)題編輯欄,文章編輯區(qū)域,提交按鈕
- 提交數(shù)據(jù),利用form表單
- 實(shí)現(xiàn):
- 編寫前端界面
<body>
<form action="" method="post">
<label> 文章標(biāo)題:
<input type="text" name="title">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content">
</label>
<br>
<input type="submit" value="提交">
</form>
- 添加頁面的響應(yīng)【配置url,寫響應(yīng)函數(shù)等等和前面一樣,不贅述】
- 寫form表單提交的響應(yīng),存儲(chǔ)新文章數(shù)據(jù)
- 編輯相應(yīng)函數(shù):
使用reques.POST["參數(shù)名"]獲取表單數(shù)據(jù);
models.Article.objects.create(title= "", content="")創(chuàng)建數(shù)據(jù)對(duì)象,并存儲(chǔ)
- 編輯相應(yīng)函數(shù):
- post 提交保單的時(shí)候,要添加
{% csrf_token %},為了網(wǎng)絡(luò)安全
修改文章
- 思路:新建文章和修改文章都是跳轉(zhuǎn)文章撰寫文章頁面,不同的是修改文章頁面需要向撰寫文章頁面?zhèn)魅胛恼耰d,為了不增加url,在這兩個(gè)操作都傳入Id,撰寫頁面?zhèn)魅?,其他頁面根據(jù)數(shù)據(jù)庫自己添加
- 具體實(shí)現(xiàn):
- 修改編輯頁面的響應(yīng)函數(shù),增加文章id,根據(jù)Id進(jìn)行判斷,為0則直接返回編輯頁面,否則根據(jù)Id取出文章對(duì)象,并將對(duì)象和頁面一起返回
def edit_page(request,article_id):
if str(article_id) == "0":
return render(request,"blog/edit_page.html")
article = models.Article.objects.get(pk=article_id)
return render(request, "blog/edit_page.html",{"article":article })
修改頁面
首頁的新文章的鏈接的url總增加參數(shù)0
文章頁面的修改文章的鏈接url,傳入文章Id-
提交操作的處理
- 思路:提交的響應(yīng)函數(shù)也要增加文章id,此id不是參數(shù),而是從前端頁面?zhèn)魅?,從request中獲取
如果為0的話,就創(chuàng)建文章;
如果不為0,就取出對(duì)象,修改屬性并保存。
- 思路:提交的響應(yīng)函數(shù)也要增加文章id,此id不是參數(shù),而是從前端頁面?zhèn)魅?,從request中獲取
def edit_action(request):
title = request.POST.get("title")
content = request.POST.get("content")
article_id = request.POST.get("article_id")
if str(article_id) == "0":
models.Article.objects.create(title=title,content=content)
articles = models.Article.objects.all()
return render(request, "blog/index.html", {"articles": articles})
article = models.Article.objects.get(pk=article_id)
article.title = title
article.content = content
article.save()
return render(request, "blog/article_page.html", {"article": article})
- 在頁面增加一個(gè)隱藏的input用于將文字Id轉(zhuǎn)入到后臺(tái)
<form action="{% url "blog:edit_action" %}" method="post">
{% csrf_token %}
{% if article %}
<input type="hidden" name="article_id" value="{{ article.id }}">
<label> 文章標(biāo)題:
<input type="text" name="title", value="{{ article.title }}">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content" value="{{ article.content }}">
</label>
{% else %}
<input type="hidden" name="article_id" value="0">
<label> 文章標(biāo)題:
<input type="text" name="title">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content">
</label>
{% endif %}
<br>
<input type="submit" value="提交">
</form>
番外篇:Django的一些使用技巧
過濾器
- 寫在模板中的,屬于DJDe 模板語言
- 可以修改模板的變量,從而顯示不同頁面
- 格式 : {{value| 過濾器}}
- 疊加{{value | filter1 | filter2 ......}}
- 例子: {{list_number| length}} 值為list_number的長(zhǎng)度
- 實(shí)戰(zhàn): 修改文章頁面的if else
############### 修改前 #######################
<body>
<form action="{% url "blog:edit_action" %}" method="post">
{% csrf_token %}
{% if article %}
<input type="hidden" name="article_id" value="{{ article.id }}">
<label> 文章標(biāo)題:
<input type="text" name="title", value="{{ article.title }}">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content" value="{{ article.content }}">
</label>
{% else %}
<input type="hidden" name="article_id" value="0">
<label> 文章標(biāo)題:
<input type="text" name="title">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content">
</label>
{% endif %}
<br>
<input type="submit" value="提交">
</form>
</body>
###############修改后#######################
<body>
<form action="{% url "blog:edit_action" %}" method="post">
{% csrf_token %}
<input type="hidden" name="article_id" value="{{ article.id | default:"0" }}">
<label> 文章標(biāo)題:
<input type="text" name="title", value="{{ article.title }}">
</label>
<br>
<label> 文章內(nèi)容:
<input type="text" name="content" value="{{ article.content }}">
</label>
<br>
<input type="submit" value="提交">
</form>
</body>
- 解析
- 首先介紹DJ的一個(gè)模板特性,
<input type="text" name="title", value="{{ article.title }}">當(dāng)模板中遇到一個(gè)沒有定義的變量時(shí),不會(huì)報(bào)錯(cuò),會(huì)默認(rèn)給一個(gè)空串,這樣,即便不做if判斷也可以兼容新文章頁面和文章編輯頁面 - 但是,后臺(tái)修改數(shù)據(jù)的時(shí)候,需要將文字id傳入到后臺(tái),即我們寫的隱藏的input便簽,這時(shí)如果傳空就會(huì)報(bào)錯(cuò),此時(shí)我們用default 過濾器,即默認(rèn)值
value="{{ article.id | default:"0"}},就可以兼容了
- 首先介紹DJ的一個(gè)模板特性,
Django shell
本質(zhì)也是一個(gè)交互命令行,但是可以引入項(xiàng)目環(huán)境,與項(xiàng)目交互
-
操作:
python manage.py shell就可以引入項(xiàng)目換將,然后就可以交互界面中實(shí)現(xiàn)項(xiàng)目代碼
djShell.png Admin
為了增加后臺(tái)管理的功能,要修改應(yīng)用下admin.py,改變注冊(cè)方式
-
具體操作:
- 創(chuàng)建admin 配置類
class ArticleAdmin(admin.ModelAdmin) - 在注冊(cè)代碼中,綁定注冊(cè)類
admin.site.register(Article,ArticleAdmin) - 修改配置類,增加功能
- 代碼
- 創(chuàng)建admin 配置類
class ArticleAdmin(admin.ModelAdmin):
# 增加顯示列數(shù),建議后面用元組,因?yàn)椴豢尚薷?,且列名要與數(shù)據(jù)庫字段名保持一致
list_display = ("title","content")
admin.site.register(Article,ArticleAdmin)
- 過濾功能(本例中以時(shí)間過濾為例子)
- models.py增加一個(gè)時(shí)間字段
pub_time = models.DateTimeField(auto_now=True)auto_nows屬性為True的時(shí)候會(huì)自動(dòng)賦值的當(dāng)前日期,但在控制臺(tái)中不能修改,若想修改則去掉此屬性
- models.py增加一個(gè)時(shí)間字段
- 在admin.py中增加此字段的顯示
list_display = ("title","content","pub_time")然后數(shù)據(jù)遷移
admin.png - 修改admin.py給時(shí)間增加過濾器
list_filter = ("pub_time",)

filter.png
- 此時(shí)后臺(tái)數(shù)據(jù)就可以進(jìn)篩選




