django入門學(xué)習(xí)

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)目目錄

tree_django.PNG

文件作用

  • 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)

tree_app.PNG

文件作用

  • 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>

超鏈接配置

超鏈接目標(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í)間的屬性
官方文檔

code

源碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末古今,一起剝皮案震驚了整個(gè)濱河市滔以,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抵碟,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拟逮,死亡現(xiàn)場離奇詭異适滓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)罚屋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門嗅绸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猛拴,你說我怎么就攤上這事羹铅≈霸保” “怎么了撼唾?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛛蒙。 經(jīng)常有香客問我,道長牵祟,這世上最難降的妖魔是什么抖格? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮收奔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滓玖。我一直安慰自己,他們只是感情好翩肌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布禁悠。 她就那樣靜靜地躺著,像睡著了一般碍侦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上比规,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天拦英,我揣著相機(jī)與錄音疤估,去河邊找鬼灾常。 笑死钞瀑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雕什。 我是一名探鬼主播显晶,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼偿警!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起螟蒸,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤崩掘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后诵原,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡皮假,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年惹资,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了航闺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潦刃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出分扎,到底是詐尸還是另有隱情,我是刑警寧澤畏吓,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站菲饼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏宏悦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一源葫、第九天 我趴在偏房一處隱蔽的房頂上張望派哲。 院中可真熱鬧,春花似錦芭届、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屡拨。三九已至,卻和暖如春呀狼,著一層夾襖步出監(jiān)牢的瞬間损离,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工僻澎, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人祖乳。 一個(gè)月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓秉氧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子垦藏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容