3.3: django實(shí)現(xiàn)博客小項(xiàng)目

前面已經(jīng)對(duì)DTL(Django Template Language)語(yǔ)言基礎(chǔ)用法進(jìn)行了講解,現(xiàn)在我們開(kāi)始做一個(gè)博客小項(xiàng)目。

1. 準(zhǔn)備工作

首先,我們整理一下整個(gè)流程,一個(gè)簡(jiǎn)單的博客項(xiàng)目包含博客列表頁(yè)、博客詳情頁(yè)、博客編輯頁(yè)、添加博客頁(yè),其頁(yè)面設(shè)計(jì)如下:

頁(yè)面設(shè)計(jì)(Page):

1.博客列表頁(yè):所有博客文章列表、寫(xiě)博客按鈕? ? ? ? ? ? ? ? blog/index? ? ? ? ? ? ? ? ? ? ? ? ? index.html

2.博客詳情頁(yè):標(biāo)題、內(nèi)容、編輯按鈕? ? ? ? ? ? ? ? ? ? ? ? blog/article/article_id? ? ? ? ? ? article_page.html

3.博客編輯頁(yè):form表單、標(biāo)題、內(nèi)容、提交按鈕? ? ? ? ? ? ? blog/article/edit? ? ? ? ? ? ? ? ? article_edit_page.html

4.添加博客頁(yè):form表單、標(biāo)題、內(nèi)容、提交按鈕事件(Action):編輯博客提交Action:post提交(博客標(biāo)題、id、內(nèi)容)新增博客提交Action:post提交(博客標(biāo)題、內(nèi)容)

下面,我們來(lái)梳理數(shù)據(jù)及頁(yè)面跳轉(zhuǎn):

頁(yè)面及數(shù)據(jù)流轉(zhuǎn)

如上,由于編輯博客、新增博客非常相似,我們就將兩個(gè)頁(yè)面合并成一個(gè)。

2. 開(kāi)始編碼

1.首先我們創(chuàng)建并配置項(xiàng)目的基本信息

打來(lái)終端,找到我們存放python項(xiàng)目的目錄python-works(這個(gè)存儲(chǔ)地址根據(jù)你個(gè)人喜好選擇),然后在終端中輸入一下命令:

django-admin startproject myblog

然后cd 到myblog的目錄下,執(zhí)行以下命令

python3manage.pyrunserver

啟動(dòng)項(xiàng)目

用瀏覽器打開(kāi)http://127.0.0.1:8000/,出現(xiàn)歡迎界面,說(shuō)明項(xiàng)目創(chuàng)建成功:

歡迎界面

還記得如何把界面修改成中文的嗎,進(jìn)入settings.py,修改以下代碼

LANGUAGE_CODE ='zh-hans'#將'en-us'改為'zh-hans' TIME_ZONE ='UTC'USE_I18N =TrueUSE_L10N =TrueUSE_TZ =True

再刷新一下界面,界面即變成中文,此時(shí)準(zhǔn)備工作已經(jīng)做完了,接下來(lái)我們開(kāi)始創(chuàng)建博客應(yīng)用。

2.創(chuàng)建博客應(yīng)用

仍然打開(kāi)終端,進(jìn)入到myblog目錄下,輸入以下命令創(chuàng)建一個(gè)名為blog的應(yīng)用:

python3manage.pystartappblog

此時(shí)項(xiàng)目中多了一個(gè)名為blog的應(yīng)用:

blog創(chuàng)建成功

打開(kāi)settings.py文件,將blog添加到應(yīng)用列表中

INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','blog',#添加blog應(yīng)用到應(yīng)用列表中]

此時(shí),我們還未創(chuàng)建任何頁(yè)面,現(xiàn)在blog下的views.py中定義一個(gè)index頁(yè),輸出一行文字,如下

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsedefindex(request):returnHttpResponse('我是博客應(yīng)用頁(yè)面!')

然后,在myblog文件夾下的urls.py文件中添加一個(gè)路徑:

fromdjango.conf.urlsimporturlfromdjango.contribimportadminfromblog.viewsimportindexurlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^index/', index)#添加index的路徑]

再重啟一下服務(wù),我們?cè)L問(wèn)http://127.0.0.1:8000/index,界面上顯示了正確的內(nèi)容

index

在前面的頁(yè)面設(shè)計(jì)中,我們想訪(fǎng)問(wèn)的是blog/index,而不是直接訪(fǎng)問(wèn)index,這個(gè)怎么做呢?其實(shí)在前面的文章?知識(shí)詳解2:django之項(xiàng)目下創(chuàng)建應(yīng)用及注意事項(xiàng)?中有詳細(xì)的說(shuō)明,在此不再贅述。我們現(xiàn)在blog下創(chuàng)建一個(gè)名為blog_urls.py的文件,然后輸入以下內(nèi)容:

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),]

然后,將系統(tǒng)的urls.py文件修改為

fromdjango.conf.urlsimporturl, includefromdjango.contribimportadminfromblog.viewsimportindexurlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^index/', include('blog.blog_urls')),]

為什么這么干,可以查看前面的文章?知識(shí)詳解2:django之項(xiàng)目下創(chuàng)建應(yīng)用及注意事項(xiàng)

再次刷新一下頁(yè)面,訪(fǎng)問(wèn)http://127.0.0.1:8000/blog/index,即顯示了正確的內(nèi)容。至此,blog項(xiàng)目的準(zhǔn)備工作做完了,接下來(lái)我們來(lái)創(chuàng)建頁(yè)面。

3.博客列表頁(yè)

前面已經(jīng)在界面上顯示了一行文字,但是這個(gè)不是我們想要的,我們需要顯示一個(gè)界面,然后在界面上顯示數(shù)據(jù)庫(kù)的文章列表,前文?知識(shí)詳解3:django之創(chuàng)建Template文件?詳細(xì)講解了如何創(chuàng)建頁(yè)面。

首先,我們?cè)赽log文件夾下創(chuàng)建一個(gè)名為templates的文件夾,并添加一個(gè)index.html文件,然后修改blog下的views.py的內(nèi)容,讓views返回index.html

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsedefindex(request):returnrender(request,'index.html')#render函數(shù)有三個(gè)參數(shù),此處只傳了兩個(gè)

此時(shí),訪(fǎng)問(wèn)http://127.0.0.1:8000/blog/index,顯示的是一個(gè)空頁(yè)面,這是因?yàn)槲覀兗葲](méi)有向index.html文件中傳遞數(shù)據(jù),也沒(méi)有在index.html中寫(xiě)顯示數(shù)據(jù)的邏輯,接下來(lái),我們準(zhǔn)備數(shù)據(jù)源。前文??知識(shí)詳解4:django之models與數(shù)據(jù)表?中有詳細(xì)的解釋。

在blog的models.py中創(chuàng)建博客對(duì)象,包含title、content兩個(gè)字端(系統(tǒng)默認(rèn)會(huì)添加一個(gè)id),models.py的代碼如下:

fromdjango.dbimportmodelsclassArticle(models.Model):title = models.CharField(max_length=32, default='')# 文章正文,使用的是TextField# 存儲(chǔ)比較短的字符串可以使用 CharField,但對(duì)于文章的正文來(lái)說(shuō)可能會(huì)是一大段文本,因此使用 TextField 來(lái)存儲(chǔ)大段文本。content = models.TextField(null=True)

然后在終端中執(zhí)行以下命令:

python3manage.pymakemigrations

成功后繼續(xù)執(zhí)行

python3manage.pymigrate

執(zhí)行結(jié)果

接下來(lái),我們?yōu)樵擁?xiàng)目創(chuàng)建一個(gè)名為yucanghai,密碼為root123456的超級(jí)用戶(hù),在登錄django后臺(tái)之前,我們需要在blog下的admin.py中配置一下

fromdjango.contribimportadminfrom.modelsimportArticleadmin.site.register(Article)#必須增加這一行,否則進(jìn)入后臺(tái)什么都沒(méi)有

接下來(lái),我們登錄后臺(tái)增加幾篇博客,如下:

博客列表

此處顯示的全部是Article object,我們調(diào)整一下models.py的代碼:

fromdjango.dbimportmodelsfromdjango.contrib.auth.modelsimportUserclassArticle(models.Model):title = models.CharField(max_length=32, default='')# 文章正文,使用的是TextField# 存儲(chǔ)比較短的字符串可以使用 CharField,但對(duì)于文章的正文來(lái)說(shuō)可能會(huì)是一大段文本,因此使用 TextField 來(lái)存儲(chǔ)大段文本。content = models.TextField(null=True)def__str__(self):#增加該方法returnself.title

刷新界面,顯示如下:

正確顯示.png

現(xiàn)在,我們需要將數(shù)據(jù)庫(kù)中的博客數(shù)據(jù)讀取出來(lái),顯示在index.html文件中。在blog下的views.py文件中讀取數(shù)據(jù)并傳遞給index.html,調(diào)整views.py代碼如下:

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()#這里是取所有,如果取某一個(gè)article = models.Article.objects.get(pk=1) returnrender(request,'index.html', {'articles': articles})

修改index.html文件,將內(nèi)容顯示出來(lái):

<!DOCTYPE html>首頁(yè)

我的博客列表:

{% for article in articles %}? ? #這是DTL的語(yǔ)法,{{ article.title }}#此處先不添加跳轉(zhuǎn)頁(yè)面,稍后再添加
{% endfor %}? ? #for循環(huán)必須以這個(gè)結(jié)尾

好,我們的博客首頁(yè)已經(jīng)完成了,接下來(lái)做博客詳情頁(yè)。

4.博客詳情頁(yè)

在templates文件夾下新建一個(gè)名為article_page.html的頁(yè)面,這個(gè)頁(yè)面的作用就是顯示博客的詳細(xì)內(nèi)容,這個(gè)頁(yè)面的數(shù)據(jù)就是上一頁(yè)面?zhèn)鬟f過(guò)來(lái)的博客對(duì)象,我們先編寫(xiě)顯示代碼:

<!DOCTYPE html>博客詳情頁(yè)

標(biāo)題: {{ article.title }}


內(nèi)容: {{ article.content }}

現(xiàn)在的問(wèn)題是要從views中將article對(duì)象傳遞給該頁(yè)面,所以我們?cè)趘iew.py中增加:

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})defarticle_page(request, article_id):#根據(jù)博客id獲取博客內(nèi)容article = models.Article.objects.get(pk=article_id)returnrender(request,'article_page.html', {'article': article})

根據(jù)上一個(gè)頁(yè)面?zhèn)鬟f的article_id獲取到這個(gè)article對(duì)象,并傳遞給html頁(yè)面顯示出來(lái),那這個(gè)article_id該怎么傳遞過(guò)來(lái)呢?參照前面的頁(yè)面設(shè)計(jì)中,我們的設(shè)計(jì)是訪(fǎng)問(wèn)博客詳情頁(yè)的地址是?http://127.0.0.1:8000/blog/article/1?,這個(gè)id可以從訪(fǎng)問(wèn)的URL中傳遞,我們來(lái)修改傳遞的url,打開(kāi)blog_urls.py文件:

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),? ? url(r'^article/(?P<article_id>[0-9])$', views.article_page),]

這里正則表達(dá)式為何這么些,會(huì)在我的文章中有專(zhuān)門(mén)的模塊來(lái)講,知道這個(gè)article_id是這么傳遞的即可,運(yùn)行一下服務(wù)器,我們?cè)L問(wèn)一下http://127.0.0.1:8000/blog/article/1是不是可以顯示正確的內(nèi)容了呢。這里需要注意的是DTL下,models自動(dòng)生成的id的下標(biāo)是從1開(kāi)始的,而不是0.

兩個(gè)頁(yè)面做好了,我們現(xiàn)在需要在index.html中增加點(diǎn)擊標(biāo)題的跳轉(zhuǎn)鏈接

第一種方式:

<!DOCTYPE html>首頁(yè)

我的博客列表:

{% for article in articles %}{{ article.title }}
{% endfor %}

再運(yùn)行一下,刷新頁(yè)面,可以正常跳轉(zhuǎn)了。但是,這種跳轉(zhuǎn)邏輯是最基礎(chǔ)的,但是當(dāng)應(yīng)用中有很多頁(yè)面的時(shí)候,這種方式顯的不靈活,現(xiàn)在看第二種方法。

第二種方式:

首先,在項(xiàng)目的urls.py中為博客應(yīng)用增加一個(gè)namespace:

from django.conf.urls import url, include

from django.contrib import admin

?from blog.views import index

urlpatterns = [? ? url(r'^admin/', admin.site.urls),? ? url(r'^blog/', include('blog.blog_urls', namespace='blog')),]

然后,在blog_urls.py中為博客詳情頁(yè)增加一個(gè)namespace:

fromdjango.conf.urlsimporturlfrom.importviews

urlpatterns = [? ? url(r'^index/', views.index),? ? url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),]

這兩步操作相當(dāng)于給博客應(yīng)用和博客詳情頁(yè)面增加一個(gè)別名,為后面調(diào)用提供一種快捷方式。我們?cè)倩氐絠ndex.html中,修改href:

<!DOCTYPE html>首頁(yè)

我的博客列表:

{% for article in articles %}{{ article.title }}
{% endfor %}

我們將href修改成DTL的另外一種表達(dá)方式,href="{% url 路徑 參數(shù) %}",其中路徑就是我們前面定義的不同層級(jí)namespace由大到小排列,如果沒(méi)有參數(shù)可以不寫(xiě)。

至此,我們的博客首頁(yè)和詳情頁(yè)已經(jīng)完善,現(xiàn)在我們需要在博客首頁(yè)增加一個(gè)新增按鈕用于跳轉(zhuǎn)到發(fā)博客頁(yè)面,在博客詳情頁(yè)增加一個(gè)編輯按鈕,用于跳轉(zhuǎn)到博客編輯頁(yè)面,我們先將index.html修改如下:

<!DOCTYPE html>首頁(yè)

我的博客列表:

{% for article in articles %}{{ article.title }}
{% endfor %}

寫(xiě)博客

博客詳情頁(yè)article_page.html修改如下:

<!DOCTYPE html>博客詳情頁(yè)

標(biāo)題: {{ article.title }}


內(nèi)容: {{ article.content }}



編輯

新增博客和編輯博客頁(yè)面相似,我們就使用同一個(gè)頁(yè)面,接下來(lái)我們編寫(xiě)編輯頁(yè)面。

5.編輯博客頁(yè)

首先,我們?cè)趖emplates下新建編輯頁(yè)面article_edit_page.html頁(yè)面

<!DOCTYPE html>編輯博客頁(yè)面博客標(biāo)題
博客內(nèi)容

這里是定義了一個(gè)form表單,用于填寫(xiě)博客標(biāo)題、內(nèi)容,并提交,在form中定義了一個(gè)action,這個(gè)是當(dāng)提交按鈕點(diǎn)擊時(shí)觸發(fā)的事件,暫時(shí)我們先空著。接下來(lái),我們?cè)趘iews中增加編輯頁(yè)面的響應(yīng)函數(shù):

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})defarticle_page(request, article_id):article = models.Article.objects.get(pk=article_id)returnrender(request,'article_page.html', {'article': article})defarticle_edit_page(request):returnrender(request,'blog/article_edit_page.html')#暫時(shí)不傳遞參數(shù)

然后在blog下的blog_urls.py中增加編輯頁(yè)面的訪(fǎng)問(wèn)路徑:

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),? ? url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),? ? url(r'^article/edit/$', views.article_edit_page),]

OK,我們?cè)L問(wèn)一下http://127.0.0.1:8000/blog/article/edit/?,此時(shí)編輯頁(yè)面就顯示出來(lái)了,這個(gè)頁(yè)面暫時(shí)是空頁(yè)面,并為傳遞任何參數(shù):

編輯頁(yè)

下面,我們需要增加提交按鈕的響應(yīng)事件,提交按鈕點(diǎn)擊時(shí)需要有一個(gè)響應(yīng)函數(shù),并有訪(fǎng)問(wèn)該函數(shù)的路徑,所以我們?cè)趘iwes中增加響應(yīng)函數(shù):

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})defarticle_page(request, article_id):article = models.Article.objects.get(pk=article_id)returnrender(request,'article_page.html', {'article': article})defarticle_edit_page(request):returnrender(request,'article_edit_page.html')defarticle_edit_page_action(request):title = request.POST.get('title','默認(rèn)標(biāo)題')##get是根據(jù)參數(shù)名稱(chēng)從form表單頁(yè)獲取內(nèi)容content = request.POST.get('content','默認(rèn)內(nèi)容')##保存數(shù)據(jù)models.Article.objects.create(title=title, content=content)##數(shù)據(jù)保存完成,返回首頁(yè)articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})

再為響應(yīng)函數(shù)增加訪(fǎng)問(wèn)路徑,打開(kāi)blog下的blog_urls.py,修改如下:

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),? ? url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),? ? url(r'^article/edit/$', views.article_edit_page, name='article_edit_page'),? ? url(r'^article/edit/action$', views.article_edit_page_action, name='article_edit_page_action'), ]

為action增加一個(gè)訪(fǎng)問(wèn)路徑,并定義一個(gè)namespace,接下來(lái),我們?cè)赼rticle_edit_page.html中設(shè)置action:

<!DOCTYPE html>編輯博客頁(yè)面{% csrf_token %}? ##這個(gè)必須添加,否則訪(fǎng)問(wèn)時(shí)報(bào)403錯(cuò)誤博客標(biāo)題
博客內(nèi)容

和前面一樣,為action增加響應(yīng)函數(shù)的路徑,這里不需要參數(shù)。csrf_token是一種網(wǎng)絡(luò)的攻擊方式,具體可以參考CSRF Token介紹與應(yīng)對(duì)策略。現(xiàn)在需要為首頁(yè)的寫(xiě)博客按鈕增加跳轉(zhuǎn)邏輯,打開(kāi)index.html:

<!DOCTYPE html>首頁(yè)

我的博客列表:

{% for article in articles %}{{ article.title }}
{% endfor %}

寫(xiě)博客

此時(shí)刷新界面,在首頁(yè)點(diǎn)擊“寫(xiě)博客”即可跳轉(zhuǎn)到編輯博客頁(yè)面,填寫(xiě)內(nèi)容提交會(huì)保存數(shù)據(jù)并跳轉(zhuǎn)到首頁(yè)面。

現(xiàn)在需要編寫(xiě)博客詳情頁(yè)的編輯按鈕的功能,點(diǎn)擊編輯按鈕需要將這篇文章的id傳遞到編輯頁(yè)面,在編輯頁(yè)面填充該博客。既然寫(xiě)新博客和編輯都是跳轉(zhuǎn)到同一個(gè)頁(yè)面,而編輯時(shí)需要傳遞參數(shù),而寫(xiě)博客不需要傳遞參數(shù),為了兼容,我們都傳遞一個(gè)參數(shù),寫(xiě)新博客時(shí)傳遞一個(gè)0,以做區(qū)別,首先,我們修改views下的編輯頁(yè)面響應(yīng)函數(shù):

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})defarticle_page(request, article_id):article = models.Article.objects.get(pk=article_id)returnrender(request,'article_page.html', {'article': article})defarticle_edit_page(request, article_id):#str方法將參數(shù)轉(zhuǎn)化為字符串,避免因傳遞類(lèi)型差異引起的錯(cuò)誤# 0代表是新增博客,否則是編輯博客,編輯博客時(shí)需要傳遞博客對(duì)象到頁(yè)面并顯示ifstr(article_id) =='0':returnrender(request,'article_edit_page.html')? ? article = models.Article.objects.get(pk=article_id)returnrender(request,'article_edit_page.html', {'article': article})defarticle_edit_page_action(request):title = request.POST.get('title','默認(rèn)標(biāo)題')##get是根據(jù)參數(shù)名稱(chēng)從form表單頁(yè)獲取內(nèi)容content = request.POST.get('content','默認(rèn)內(nèi)容')##保存數(shù)據(jù)models.Article.objects.create(title=title, content=content)##數(shù)據(jù)保存完成,返回首頁(yè)articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})

這里是傳遞的有參數(shù)的,我們需要修改blog_urls下修改博客詳情頁(yè)的訪(fǎng)問(wèn)路徑,增加參數(shù)

fromdjango.conf.urlsimporturlfrom.importviewsurlpatterns = [? ? url(r'^index/', views.index),? ? url(r'^article/(?P<article_id>[0-9]+)$', views.article_page, name='article_page'),? ? url(r'^article/edit/(?P<article_id>[0-9]+)$', views.article_edit_page, name='article_edit_page'),#路徑中傳遞頁(yè)碼url(r'^article/edit/action$', views.article_edit_page_action, name='article_edit_page_action'),]

然后修改index.html,在點(diǎn)擊寫(xiě)博客時(shí)傳遞0

寫(xiě)博客

修改article_page.html,為編輯按鈕增加參數(shù):

a href=" {% url 'blog:article_edit_page' article.id %} ">編輯

接下來(lái),我們修改article_page_edit.html,當(dāng)從博客詳情頁(yè)進(jìn)入時(shí)顯示博客內(nèi)容,從首頁(yè)進(jìn)入時(shí)不顯示內(nèi)容:

<!DOCTYPE html>編輯博客頁(yè)面{% csrf_token %}? ? {% if article %}博客標(biāo)題
博客內(nèi)容
{% else %}博客標(biāo)題
博客內(nèi)容
{% endif %}

很好理解是不是,有博客就顯示,沒(méi)有就不顯示?,F(xiàn)在問(wèn)題來(lái)了,在編輯頁(yè)面,點(diǎn)擊提交按鈕到底是新增還是保存呢,現(xiàn)在我們需要在views中修改action的響應(yīng)函數(shù):

fromdjango.shortcutsimportrenderfromdjango.httpimportHttpResponsefrom.importmodelsdefindex(request):articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})defarticle_page(request, article_id):article = models.Article.objects.get(pk=article_id)returnrender(request,'article_page.html', {'article': article})defarticle_edit_page(request, article_id):#str方法將參數(shù)轉(zhuǎn)化為字符串,避免因傳遞類(lèi)型差異引起的錯(cuò)誤# -1代表是新增博客,否則是編輯博客,編輯博客時(shí)需要傳遞博客對(duì)象到頁(yè)面并顯示ifstr(article_id) =='0':returnrender(request,'article_edit_page.html')? ? article = models.Article.objects.get(pk=article_id)returnrender(request,'article_edit_page.html', {'article': article})defarticle_edit_page_action(request):title = request.POST.get('title','默認(rèn)標(biāo)題')##get是根據(jù)參數(shù)名稱(chēng)從form表單頁(yè)獲取內(nèi)容content = request.POST.get('content','默認(rèn)內(nèi)容')? ? article_id = request.POST.get('article_id_hidden','0')##隱藏參數(shù),參數(shù)是在web中定義##保存數(shù)據(jù)##如果是0,標(biāo)記新增,使用create方法,否則使用save方法##新增是返回首頁(yè),編輯是返回詳情頁(yè)ifstr(article_id) =='0':? ? ? ? models.Article.objects.create(title=title, content=content)##數(shù)據(jù)保存完成,返回首頁(yè)articles = models.Article.objects.all()returnrender(request,'index.html', {'articles': articles})? ? article = models.Article.objects.get(pk=article_id)? ? article.title = title? ? article.content = content? ? article.save()returnrender(request,'article_page.html', {'article': article})

然后我們修改article_page_edit.html頁(yè)面,處理傳遞id和不傳遞id時(shí)提交事件的響應(yīng)方法:

<!DOCTYPE html>編輯博客頁(yè)面{% csrf_token %}? ? {% if article %}博客標(biāo)題
博客內(nèi)容
{% else %}博客標(biāo)題
博客內(nèi)容
{% endif %}

運(yùn)行一下程序,是不是新增和編輯功能都正常了呢,??!好了,整個(gè)博客小項(xiàng)目編寫(xiě)完成了。

點(diǎn)擊下載完整的項(xiàng)目代碼

3.小結(jié)

這個(gè)小demo非常基礎(chǔ),主要是講解DTL語(yǔ)言的用法。從應(yīng)用創(chuàng)建的設(shè)置,到應(yīng)用中頁(yè)面的顯示、事件的處理,在后面的文章中我會(huì)寫(xiě)比較復(fù)雜的項(xiàng)目。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 去年的事情特別多,也沒(méi)有什么時(shí)間充電學(xué)習(xí)。今年目測(cè)輕松一點(diǎn),年初本來(lái)計(jì)劃就好好休息一下,結(jié)果一晃2017就度過(guò)了一...
    灰豹兒閱讀 688評(píng)論 0 2
  • 通過(guò)寫(xiě)一個(gè)博客項(xiàng)目,來(lái)串聯(lián)自己的知識(shí)點(diǎn),并總結(jié)一些小的技巧 頁(yè)面介紹 1.博客主頁(yè)面 2.博客文章內(nèi)容頁(yè)面...
    be_keeper閱讀 785評(píng)論 0 0
  • 前面已經(jīng)對(duì)DTL(Django Template Language)語(yǔ)言基礎(chǔ)用法進(jìn)行了講解,現(xiàn)在我們開(kāi)始做一個(gè)博客...
    E思無(wú)邪閱讀 27,945評(píng)論 6 18
  • 1.簡(jiǎn)介 ython下有許多款不同的 Web 框架。Django是重量級(jí)選手中最有代表性的一位。許多成功的網(wǎng)站和A...
    可汗?fàn)敔?/span>閱讀 1,338評(píng)論 0 3
  • 本博客是記錄跟從慕課網(wǎng)課程所記下的筆記,更多內(nèi)容請(qǐng)?jiān)L問(wèn)慕課網(wǎng)慕課網(wǎng)--項(xiàng)目源碼 新建項(xiàng)目 打開(kāi)命令行,進(jìn)入到打算打...
    小白猿閱讀 2,527評(píng)論 1 10

友情鏈接更多精彩內(nèi)容