django官網(wǎng)
安裝
- 源碼安裝
下載源碼
然后 到django目錄下 運(yùn)行 pip install -e django/ - pip 安裝 [推薦]
Install : pip install django(過程可能會比較慢)
創(chuàng)建項(xiàng)目和應(yīng)用
新建項(xiàng)目
django-admin startproject projectname
項(xiàng)目目錄
文件作用
- manage.py: 一個(gè)實(shí)用的命令行工具世吨,可讓你以各種方式與該 Django 項(xiàng)目進(jìn)行交互呻征。
- myblog: 項(xiàng)目的容器。
- myblog/init.py: 一個(gè)空文件沐祷,告訴 Python 該目錄是一個(gè) Python 包攒岛。
- myblog/settings.py: 該 Django 項(xiàng)目的設(shè)置/配置。
最核心 - myblog/urls.py: 該 Django 項(xiàng)目的 URL 聲明; 一份由 Django 驅(qū)動的網(wǎng)站"目錄"兢榨,配置URL文件。
- myblog/wsgi.py: 一個(gè) WSGI兼容的 Web 服務(wù)器的入口凌那,以便運(yùn)行你的項(xiàng)目吟逝。
不更改
Python Web Server Gateway Interface
Python服務(wù)器網(wǎng)關(guān)接口
Python應(yīng)用與web服務(wù)器之間的接口
創(chuàng)建應(yīng)用
進(jìn)入manage.py同級目錄
python manage.py startapp appname
添加應(yīng)用名到settings.py中的INSTALLED_APPS 里
INSTALLED_APPS = [
...
'blog',
]
目錄結(jié)構(gòu)
文件作用
- admin.py: 當(dāng)前應(yīng)用的后臺管理系統(tǒng)配置块攒。
- migrations: 數(shù)據(jù)移植模塊。
- migrations/init.py: 一個(gè)空文件麦锯。
- apps.py: 當(dāng)前應(yīng)用的配置琅绅。
最核心 - models.py: 數(shù)據(jù)模塊,使用ORM框架料祠。
- test.py: 自動化測試模塊澎羞。
- views.py:執(zhí)行響應(yīng)的代碼所在模塊,代碼邏輯處理的主要地點(diǎn)顺呕,主要代碼編輯區(qū)域括饶。
創(chuàng)建第一個(gè)頁面(響應(yīng))
- 編輯blog.views
每個(gè)響應(yīng)對應(yīng)一個(gè)函數(shù),函數(shù)必須返回一個(gè)響應(yīng)
函數(shù)必須存在一個(gè)參數(shù)启盛,一般設(shè)定為request
每個(gè)響應(yīng)對應(yīng)一個(gè)url
from django.http import HttpResponse
def index(request):
return HttpResponse('nihao shijie!')
- 編輯urls.py
每個(gè)URL都以url的形式寫出來
url函數(shù)放在urlpatterns列表中
url函數(shù)三個(gè)參數(shù);URL(正則)技羔,對應(yīng)方法,名稱
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^index/', bv.index),#新增
]
- 配置url方法二
編輯urls.py
from django.conf.urls import url,include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls')),#更改為^blog鳖粟,地址以blog開頭
]
在app目錄下新建urls.py文件
from django.conf.urls import url
from .import views
urlpatterns = [
url(r'^index/$', views.index),#正則表達(dá)式(RE)可為空(r'^$')超陆,也可為固定的一個(gè)地址浦马,注意index后的'/'
]
在瀏覽器地址欄中輸入http://127.0.0.1:8000/blog/index/ 即可
- 注意事項(xiàng)
根urls.py針對app配置的url名稱晶默,是該app所有url的總路徑
配置url時(shí)注意正則表達(dá)式結(jié)尾符號$和/
開發(fā)一個(gè)template(界面)
template
是一個(gè)HTML文件
使用了Django模板語言(Django Template Language,DTL)(引擎)
可以使用第三方模板(如Jinja2)
步驟
- 在app根目錄下創(chuàng)建名為Templates的目錄
- 在該目錄下創(chuàng)建HTML界面
- 在views.py中返回render()
def index(request):
return render(request, 'index.html')
DTL初步使用
render()函數(shù)中支持一個(gè)dict類型參數(shù)
該字典是后臺傳遞到模板的參數(shù)磺陡,鍵為參數(shù)名
return render(request, 'index.html',{'hello':'Happy new year!'})
在模板中使用{{參數(shù)名}}來使用
<body>
<h1>{{hello}}</h1>
</body>
此處有坑
此時(shí)再新建一個(gè)app漠畜,此目錄下Templates中的html界面命名與之前app一樣,則django會按照installed_app中的順序查找蝴悉,以至于會忽略掉新建的template
解決辦法:將app的Templates目錄下創(chuàng)建與app同名的目錄
將html文件放入該目錄中瘾敢,同時(shí)更改views.py文件中的render()第二個(gè)參數(shù)
Models
概念
通常,一個(gè)Model對應(yīng)數(shù)據(jù)庫的一張數(shù)據(jù)表
Django中Models以類的形式表現(xiàn)
它包含了一些基本字段以及數(shù)據(jù)的一些行為
實(shí)現(xiàn)了ORM(對象關(guān)系映射)
實(shí)現(xiàn)了對象和數(shù)據(jù)庫之間的映射
隱藏了數(shù)據(jù)訪問細(xì)節(jié)(封裝了數(shù)據(jù)庫的操作庆杜,不用寫SQL語句)
編寫Models
步驟
- 在應(yīng)用根目錄下創(chuàng)建models.py,并引入models模塊
- 創(chuàng)建類碟摆,繼承models.Model,該類即使一張數(shù)據(jù)表
- 在類中創(chuàng)建字段
字段即類中的屬性(變量)
title = models.CharField(max_length = 32,default = 'title')
content = models.TextField(null = True)
https://docs.djangoproject.com/en/1.10/ref/models/fields/
生成數(shù)據(jù)表
步驟
- 在命令行中進(jìn)入manage.py同級目錄
- 執(zhí)行 python manage.py makemigrations app名(可選)
- 再執(zhí)行 python manage.py migrate
查看 - Django會自動在app/migreations/目錄下生成移植文件
- 執(zhí)行python manage.py sqlmigrate appname 文件id 查看sql語句
CREATE TABLE "blog_article" ("id" integer NOT NULL PRIMARY KEY AUTOINCREMENT, "title" varchar(32) NOT NULL, "content" text NULL);
頁面呈現(xiàn)數(shù)據(jù)
- 后臺步驟
修改views.py
from. import models
...
article = models.Article.objects.get(pk=1)
return render(request, 'index.html', {'article': article})
- 前端步驟
模板可直接使用對象以及對象的"."操作
<body>
<h1>{{article.title}}</h1>
<h3>{{article.content}}</h3>
</body>
Admin
簡介
- 自帶的自動化數(shù)據(jù)管理界面
- 被授權(quán)的用戶可直接在admin中管理數(shù)據(jù)庫
- 許多針對Admin的定制功能
配置
- 創(chuàng)建用戶
python manage.py createsuperuser 創(chuàng)建超級用戶 - 修改admin界面為中文
修改settings.py 中LANGUAGE_CODE = 'zh_Hans'
配置應(yīng)用(增加數(shù)據(jù)庫管理)
- 在應(yīng)用下admin.py中引入自身的models模塊(或里邊的模型類)
from models import Article
- 編輯 admin.py:admin.site.register(models.Article)
admin.site.register(Article)
修改數(shù)據(jù)默認(rèn)顯示名稱
- 在Article下添加一個(gè)方法
def __unicode__(self):(python 2.X)
return self.title
or
def __str__(self):(python 3.X)
return self.title
完善博客
博客頁面設(shè)計(jì)
頁面概要
- 博客主頁面
- 博客文章內(nèi)容頁面
- 博客撰寫頁面
博客主頁面
主頁面內(nèi)容
- 文章標(biāo)題列表断盛,超鏈接
- 發(fā)表博客按鈕(超鏈接)
列表編寫思路
- 讀取數(shù)據(jù)庫中所有文章對象
- 將文章對象們打包成列表嘉裤,傳遞到前端
- 前端頁面把文章以標(biāo)題超鏈接的形式逐個(gè)給出
實(shí)現(xiàn)思路
模板For循環(huán)
{% for xx in xxs %}
HTML語句
{%endfor %}
具體實(shí)現(xiàn)
后臺代碼,修改views.py
def index(request):
articles = models.Article.objects.all()
return render(request, 'index.html', {'articles': articles})
前端代碼,修改index.html
博客文章界面
編寫思路
- 標(biāo)題
- 文章內(nèi)容
- 修改文章按鈕(超鏈接)
具體實(shí)現(xiàn)
- 在views.py中增加一個(gè)響應(yīng)
def article_page(request, article_id):
article = models.Article.objects.get(pk=article_id)
return render(request,'blog/article_page.html',{'article':article})
- 配置app目錄下的urls.py文件,正則中的組名必須和參數(shù)名一致
url(r'^article/(?P<article_id>[0-9]+)$', views.article_page),
- 編寫界面仇让,新建article_page.html文件
<body>
<h1>{{article.title}}</h1>
<br/>
<h3>
{{article.content}}
</h3>
<br/><br/>
<a href="">Edit</a>
</body>
- 瀏覽器輸入 http://127.0.0.1:8000/blog/article/1 驗(yàn)證
超鏈接配置
超鏈接目標(biāo)地址
href后面是目標(biāo)地址
template中可以用"{% url 'app_name:url_name' param %}"
其中app_name和url_name都在url中配置
再配URL
- 根urls,寫在include()的第二個(gè)參數(shù)位置卫玖,namespace = 'blog'
url(r'^blog/', include('blog.urls', namespace='blog')),
- 應(yīng)用下則寫在url()的第三個(gè)參數(shù)位置踊淳,name = 'article'
url(r'^article/(?P<article_id>[0-9]+)$',
views.article_page, name='article_page'),
主要取決于是否使用include引用了另外一個(gè)url配置文件
- 修改index.html
<a href="{% url 'blog:article_page' article.id%}">{{article.title}}</a>
博客撰寫頁面
頁面內(nèi)容
- 標(biāo)題編輯欄
- 文章內(nèi)容編輯區(qū)域
- 提交按鈕
實(shí)現(xiàn)
- 新建頁面
<form action="" method="post">
{% csrf_token %}<!--post表單都需要添加這一句,避免403錯(cuò)誤-->
<label>文章標(biāo)題
<input type="text" name="title"/>
</label>
<br/>
<label>文章內(nèi)容
<input type="text" name="content"/>
</label>
<br/>
<input type="submit" value = "提交"/>
<br/>
</form>
- 編輯響應(yīng)函數(shù)
使用request.POST['參數(shù)名']獲取表單數(shù)據(jù)脱茉,使用models.Article.objects.create(title, content)創(chuàng)建對象,寫入數(shù)據(jù)庫税肪,然后返回主頁
def edit_action(request):
title = request.POST.get('title', 'TITLE')
content = request.POST.get('content', 'CONTENT')
models.Article.objects.create(title=title, content=content)
articles = models.Article.objects.all()
return render(request, 'blog/index.html', {'articles': articles})
博客修改頁面
思路
- 新文章為空榜田。修改文章有內(nèi)容
- 修改文章頁面有文章對象
- 文章的ID
實(shí)現(xiàn) - 修改響應(yīng)函數(shù)
def edit_page(request, article_id):
if str(article_id) == '0':#判斷是編輯還是新建
return render(request, 'blog/edit_page.html')
else:
article = models.Article.objects.get(pk=article_id)
return render(request, 'blog/edit_page.html', {'article': article})
def edit_action(request):
title = request.POST.get('title', 'TITLE')
content = request.POST.get('content', 'CONTENT')
article_id = request.POST.get('article_id', '0')
if 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)
'''
修改數(shù)據(jù)庫
'''
article.title = title
article.content = content
article.save()
return render(request, 'blog/article_page.html', {'article': article})
- 修改 blog/urls.py
url(r'^edit/(?P<article_id>[0-9]+)$', views.edit_page, name='edit_page'),
- 修改前端文件
index.html
<a href="{% url 'blog:edit_page' 0 %}">新文章</a>
edit_page.html
{% 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>
<br/>
<input type="submit" value="提交" />
<br/> {% 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>
<br/>
<input type="submit" value="提交" />
<br/>
{% endif %}
django trick
Templates過濾器
簡介
寫在模板中箭券,屬于django模板語言
可以修改模板的變量,從而顯示不同的內(nèi)容
使用
{{ value|filter }}
例子:{{ list_nums | length }} 顯示長度
<input type="hidden" name="article_id" value="{{article.id | default:'0'}}">
省去了if else的重復(fù)代碼
官方文檔
django shell
簡介
一個(gè)python的交互式命令行程序
優(yōu)點(diǎn):自動引入了項(xiàng)目環(huán)境蛔六,可以與項(xiàng)目交互
使用
python manage.py shell
例子:
獲得數(shù)據(jù)庫
from blog.models import Article
Article.objects.all()
作用
- 調(diào)試
- 測試未知的方法
Admin增強(qiáng)
顯示數(shù)據(jù)庫中的數(shù)據(jù)更多的列
修改admin.py
- 創(chuàng)建admin配置類
class ArticleAdmin(admin.ModelAdmin):
pass
- 注冊配置類
admin.site.register(Article,ArticleAdmin)
- 顯示其他字段
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','content')
過濾器
與django模板中的不同
class ArticleAdmin(admin.ModelAdmin):
list_display = ('title','content','pub_time')
list_filter = ('pub_time',)
在之前先加上時(shí)間的屬性
官方文檔