零基礎(chǔ)入手Django(九):模型基礎(chǔ)4

今天货抄,小叮當(dāng)來為大家繼續(xù)分享Django的干貨~

主要內(nèi)容有:項目的搭建復(fù)習(xí)和博客小案例

一饶火、項目的搭建復(fù)習(xí)

在xshell中進(jìn)入我們之前創(chuàng)建的虛擬環(huán)境

執(zhí)行workon

執(zhí)行workon djtest2.1?

djtest2.1為我們創(chuàng)建的虛擬環(huán)境,忘了的話可以回頭看下零基礎(chǔ)入手Django(一):基本介紹及環(huán)境搭建

執(zhí)行l(wèi)s? 執(zhí)行cd dj_project? ? ?dj_project為我們之前創(chuàng)建的用來存儲django項目的文件夾

執(zhí)行pip list?來檢查當(dāng)前環(huán)境是否可以進(jìn)行django項目創(chuàng)建

2.執(zhí)行命令“django -admin startproject 項目名” 來創(chuàng)建項目

我們以創(chuàng)建mysite項目為例

(1)執(zhí)行命令“django-admin startproject mysite

執(zhí)行”ls"查看項目

(2)執(zhí)行cd mysite?進(jìn)入mysite文件夾?

?執(zhí)行ls查看文件

執(zhí)行tree命令查看文件結(jié)構(gòu)

(3)在pycharm中新建本地普通項目mysite用來進(jìn)行代碼同步

選擇在新窗口打開

點擊ok后啡彬,便可在新的pycharm窗口看到新建的項目

(4)進(jìn)行代碼同步

在Tools中找到“Deployment"找到Configuration

配置如下

點擊 Test SFTP connection進(jìn)行檢測

在mappings配置服務(wù)器中項目的路徑

值得注意的是戒良,同步時谋逻,我們一定要選擇項目的最外層目錄

配置完成后點擊ok即可染苛。

在Tools中找到Deployment?在其中找到Download from ...?將服務(wù)器端的代碼下載到本地鹊漠。

可以看到點擊后,代碼便被飛快地同步到本地

(5)配置啟動django服務(wù)

點擊pycharm右上角的小三角

點擊后選擇編輯配置

在配置頁面選擇左上角的綠色小加號?選擇django server

配置django server?取名為mysite?配置host為0.0.0.0

配置環(huán)境變量

新建環(huán)境變量DJANGO_SETTINGS_MODULE?值為mysite.settings(項目名.settings)

選擇服務(wù)器端的解釋器

點擊fix

勾選Enable Django Support 并配置本地的mysite路徑和settings文件

配置本地mysite路徑

配置settings路徑

配置完成后點擊apply進(jìn)行應(yīng)用后,點擊ok

運行django server 之后若報如下錯誤

則從file處進(jìn)入settings配置python解釋器躯概,點擊其旁邊的修改按鈕為其配置ssh認(rèn)證信息即可登钥。

之后便可啟動mysite項目

(6)新建名為blog的app

打開Tools?選中Run manage.py Task...

執(zhí)行命令startapp blog

在項目目錄處右擊選擇 Deployment Download ....

下載完成后,便可看到新建的blog

(7)對項目進(jìn)行基本的配置

進(jìn)入mysite項目的settings.py進(jìn)行配置

①配置所有主機(jī)均可訪問

ALLOWED_HOSTS?=?['*']

注冊app

②在項目中新建templates目錄

在settings.py中配置對應(yīng)路徑

代碼如下

'DIRS':?[os.path.join(BASE_DIR,'templates')],

③新建static文件夾娶靡,并建立js牧牢、images、css子文件夾 用來存放靜態(tài)文件

在settings中配置相應(yīng)的路徑

代碼如下:

STATICFILES_DIRS?=?[

os.path.join(BASE_DIR,'static')

]

④配置數(shù)據(jù)庫

在xshell中進(jìn)入mysql 執(zhí)行?create database mysite;

在settings中進(jìn)行配置

代碼如下:

DATABASES?=?{

'default':?{

'ENGINE':?'django.db.backends.mysql',??#?數(shù)據(jù)庫引擎

'NAME':?'mysite',????????????????#數(shù)據(jù)庫名稱

'USER':?'xdd',???????????????#?鏈接數(shù)據(jù)庫的用戶名

'PASSWORD':?'xdd',??????#?鏈接數(shù)據(jù)庫的密碼

'HOST':?'192.168.255.130',???????????#?mysql服務(wù)器的域名和ip地址

'PORT':?'3306',????????????????#?mysql的一個端口號,默認(rèn)是3306

}

}

在主目錄下的_init_.py中通過pymysql將其使用

代碼如下:

import?pymysql

pymysql.install_as_MySQLdb()

(8)配置路由

①在blog文件夾下新建urls.py文件

②在主目錄下的urls.py中 import include 并分配路由

具體代碼如下:

from?django.contrib?import?admin

from?django.urls?import?path,include

urlpatterns?=?[

path('admin/',?admin.site.urls),

path('blog/',include('blog.urls')),

]

到此一個django項目的新建與基本配置就算復(fù)習(xí)完成了姿锭,你掌握了嗎塔鳍?

二、博客小案例

1.數(shù)據(jù)庫中的數(shù)據(jù)渲染進(jìn)模板

數(shù)據(jù)庫中的數(shù)據(jù)傳入模板示意圖如下

視圖函數(shù)可以查找數(shù)據(jù)庫中的數(shù)據(jù)艾凯,通過context傳給模版献幔。模版經(jīng)過render渲染即可展示在頁面上。

2.博客小案例主要功能

在本次博客小案例中趾诗,我們主要實現(xiàn)主頁蜡感、添加頁、列表頁恃泪、詳情頁這幾個功能郑兴。

我們在建好的mysite項目中,找到建好的templates目錄贝乎,在其下新建blog目錄情连,在其中新建

”demo_add.html"、“demo_base.html”览效、"demo_detail.html"

"demo_indesx.html"却舀、“demo_list.html”

(1)demo_add.html代碼如下:

{% extends 'blog/demo_base.html' %}

{% block title %}

添加博客{% endblock %}

{% block bodyblock %}

添加新文章

{% csrf_token %}

標(biāo)題

內(nèi)容

發(fā)布博客

{% endblock %}

(2)demo_base.html代碼如下:

{% block title %}

{% endblock %}

{% block bodyblock %}

{% endblock %}

(3)demo_detail.html代碼如下:

{% extends 'blog/demo_base.html' %}

{% block title %}

文章詳情{% endblock %}

{% block bodyblock %}

文章標(biāo)題

文章內(nèi)容{% endblock %}

(4)demo_index.html代碼如下:

{% extends 'blog/demo_base.html' %}

{% block title %}

首頁{% endblock %}

{% block bodyblock %}

添加文章

文章列表

{% endblock %}

(5)demo_list.html代碼如下:

{% extends 'blog/demo_base.html' %}

{% block title %}

文章列表{% endblock %}

{% block bodyblock %}

文章列表

標(biāo)題

操作

文章1

編輯 | 刪除

文章2

編輯 | 刪除

{% endblock %}

將代碼上傳到服務(wù)端

(6)配置blog下的views.py中配置視圖函數(shù)

from?django.shortcuts?import?render

#?Create?your?views?here.

def?blog_index(request):

return?render(request,'blog/demo_index.html')

def?blog_add(request):

return?render(request,'blog/demo_add.html')

def?blog_list(request):

return?render(request,'blog/demo_list.html')

def?blog_detail(request):

return?render(request,'blog/demo_detail.html')

(7)配置blog下的urls.py分配路由

from?django.urls?import?path,include

from?.?import?views

urlpatterns?=?[

path('index',views.blog_index,name='blog_index'),

path('add',?views.blog_add,?name='blog_add'),

path('list',?views.blog_list,?name='blog_list'),

path('detail',?views.blog_detail,?name='blog_index'),

]

(8)將配置好的代碼上傳到服務(wù)器后,在瀏覽器中查看

添加博客

主頁

列表

2.創(chuàng)建數(shù)據(jù)庫用來存儲博客

(1)在blog的models.py創(chuàng)建模型類

from?django.db?import?models

#?Create?your?models?here.

class?BlogModel(models.Model):

#創(chuàng)建title字段用來存儲博客標(biāo)題??blank表示允許title為空且與表單有關(guān)

title?=?models.CharField(max_length=100,blank=True)

#創(chuàng)建內(nèi)容字段

content?=?models.TextField()

(2)執(zhí)行makemigrations? 執(zhí)行migrate?映射到數(shù)據(jù)庫

(3)在xshell中進(jìn)入mysql進(jìn)行查看

執(zhí)行?use mysite;?執(zhí)行?show tables;

執(zhí)行desc blog_blogmodel;

3.實現(xiàn)各頁面的功能

(1)實現(xiàn)主頁

代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

首頁{% endblock %}

{% block bodyblock %}

添加文章

文章列表

{% endblock %}

在瀏覽器中查看? ?點擊“添加文章”

點擊文章列表

(2)實現(xiàn)添加頁

在views.py中修改添加視圖函數(shù)

代碼如下

from?django.shortcuts?import?render

from?django.http??import?HttpResponse

#?Create?your?views?here.

#導(dǎo)入模型類

from?.models?import?BlogModel

def?blog_index(request):

return?render(request,'blog/demo_index.html')

def?blog_add(request):

if?request.method=='POST':

#從前端頁面中獲取數(shù)據(jù)

title?=?request.POST.get('title')

content?=?request.POST.get('content')

#存儲數(shù)據(jù)進(jìn)入數(shù)據(jù)庫

blog?=?BlogModel(title=title,content=content)

blog.save()

return?HttpResponse('博客發(fā)表成功锤灿!')

return?render(request,'blog/demo_add.html')

def?blog_list(request):

return?render(request,'blog/demo_list.html')

def?blog_detail(request):

return?render(request,'blog/demo_detail.html')

在瀏覽器中查看挽拔,并添加數(shù)據(jù),點擊“發(fā)布博客

點擊“發(fā)布博客"后

通過xshell在數(shù)據(jù)庫中查看

執(zhí)行命令”select * from blog_blogmodel;

(3)實現(xiàn)博客列表頁

重新定義views.py中的視圖函數(shù)

代碼如下

def?blog_list(request):

blogs?=?BlogModel.objects.all()

return?render(request,'blog/demo_list.html',context={'blog_list':blogs})

重新定義博客列表

html代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

文章列表{% endblock %}

{% block bodyblock %}

文章列表

標(biāo)題

操作

{% for blog in blog_list %}

{{ blog.title }}

編輯 | 刪除

{% endfor %}

{% endblock %}

瀏覽器中查看

數(shù)據(jù)庫中查看

(4)實現(xiàn)博客詳情頁

重新定義views.py中的視圖函數(shù)

代碼如下

def?blog_detail(request,blog_id):

blogd?=BlogModel.objects.get(id=blog_id)

return?render(request,'blog/demo_detail.html',context={'blog':blogd})

在urls.py中重新進(jìn)行路由配置但校,為blog_id配置路由

代碼如下

path('detail/<blog_id>', views.blog_detail, name='blog_detail'),

重新定義html

{% extends 'blog/demo_base.html' %}

{% block title %}

文章詳情{% endblock %}

{% block bodyblock %}

{{ blog.title }}

{{ blog.content }}

{% endblock %}

在列表html中引用詳情頁的信息?實現(xiàn)點擊文章標(biāo)題查看文章詳情的功能

代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

文章列表{% endblock %}

{% block bodyblock %}

文章列表

標(biāo)題

操作

{% for blog in blog_list %}

{{ blog.title }}

編輯 | 刪除

{% endfor %}

{% endblock %}

在瀏覽器中查看

點擊標(biāo)題后螃诅,便跳轉(zhuǎn)到了文章的詳情頁

(5)實現(xiàn)刪除功能

在views.py中定義視圖函數(shù)

代碼如下

from?django.shortcuts?import?render,redirect,reverse

def?blog_delete(request,blog_id):

del_blog?=?BlogModel.objects.filter(id?=?blog_id)

if?del_blog:

del_blog.delete()

return?redirect(reverse('blog_list'))

else:

return?HttpResponse('沒有這篇博客')

在urls.py中配置對應(yīng)的路由

path('delete/<blog_id>', views.blog_delete, name='blog_delete'),

在博客列表html中配置刪除時的頁面跳轉(zhuǎn)

代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

文章列表{% endblock %}

{% block bodyblock %}

文章列表

標(biāo)題

操作

{% for blog in blog_list %}

{{ blog.title }}

編輯 | 刪除

{% endfor %}

{% endblock %}

在瀏覽器中查看?點擊刪除

刪除后

此時只有兩篇文章,測試刪除第3篇文章

輸入地址http://192.168.255.130:8000/blog/delete/3

(6)實現(xiàn)編輯功能

在templates下的blog文件夾下新建html命名為demo_edit.html

建立后

書寫代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

添加博客{% endblock %}

{% block bodyblock %}

編輯文章

{% csrf_token %}

標(biāo)題

內(nèi)容

確認(rèn)編輯

{% endblock %}

在urls.py中配置路由

代碼如下

path('edit/<blog_id>', views.blog_edit, name='blog_edit'),

在views.py中書寫視圖函數(shù)

def?blog_edit(request,blog_id):

#當(dāng)使用filter獲取數(shù)據(jù)時為Querset對象

e_blog?=?BlogModel.objects.filter(id?=?blog_id)

if?request.method=='GET':

#?當(dāng)使用filter獲取數(shù)據(jù)時為Querset對象?需用first()取出數(shù)據(jù)

return?render(request,'blog/demo_edit.html',context={'e_blog':e_blog.first()})

elif?request.method=='POST':

if?e_blog:

title?=?request.POST.get('title')

content?=?request.POST.get('content')

e_blog.update(title=title,content=content)

return?HttpResponse("博客編輯成功")

else:

return?HttpResponse('沒有這篇博客状囱!')

else:

return?HttpResponse('不能處理的請求术裸!')

根據(jù)視圖函數(shù)修改demo_edit.html

代碼如下

{% extends 'blog/demo_base.html' %}

{% block title %}

添加博客{% endblock %}

{% block bodyblock %}

編輯文章

{% csrf_token %}

標(biāo)題

內(nèi)容 {{ e_blog.content }}

確認(rèn)編輯

{% endblock %}

在demo_list.html中為編輯添加url

代碼如下:

{% extends 'blog/demo_base.html' %}

{% block title %}

文章列表{% endblock %}

{% block bodyblock %}

文章列表

標(biāo)題

操作

{% for blog in blog_list %}

{{ blog.title }}

編輯 | 刪除

{% endfor %}

{% endblock %}

在瀏覽器中查看?

進(jìn)入列表頁面,點擊編輯

點擊后便可自動進(jìn)入編輯頁面

我們修改內(nèi)容后,點擊確認(rèn)編輯

之后出現(xiàn)相應(yīng)提示

返回列表,點擊博客標(biāo)題查看詳情

查看結(jié)果為

可見敛助,此時我們已經(jīng)成功完成博客的編輯功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匹表,一起剝皮案震驚了整個濱河市门坷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌袍镀,老刑警劉巖默蚌,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異苇羡,居然都是意外死亡绸吸,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門设江,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锦茁,“玉大人,你說我怎么就攤上這事叉存÷肓” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵歼捏,是天一觀的道長稿存。 經(jīng)常有香客問我,道長瞳秽,這世上最難降的妖魔是什么瓣履? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮练俐,結(jié)果婚禮上袖迎,老公的妹妹穿的比我還像新娘。我一直安慰自己腺晾,他們只是感情好燕锥,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悯蝉,像睡著了一般脯宿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上泉粉,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音榴芳,去河邊找鬼嗡靡。 笑死,一個胖子當(dāng)著我的面吹牛窟感,可吹牛的內(nèi)容都是我干的讨彼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼柿祈,長吁一口氣:“原來是場噩夢啊……” “哼哈误!你這毒婦竟也來了哩至?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蜜自,失蹤者是張志新(化名)和其女友劉穎菩貌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重荠,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡箭阶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了戈鲁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片仇参。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婆殿,靈堂內(nèi)的尸體忽然破棺而出诈乒,到底是詐尸還是另有隱情,我是刑警寧澤婆芦,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布怕磨,位于F島的核電站,受9級特大地震影響寞缝,放射性物質(zhì)發(fā)生泄漏癌压。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一荆陆、第九天 我趴在偏房一處隱蔽的房頂上張望滩届。 院中可真熱鬧,春花似錦被啼、人聲如沸帜消。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泡挺。三九已至,卻和暖如春命浴,著一層夾襖步出監(jiān)牢的瞬間娄猫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工生闲, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留媳溺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓碍讯,卻偏偏與公主長得像悬蔽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捉兴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

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