Django搭建博客頁面

Django基本使用以及博客搭建的準備工作逝嚎,請參考Django入門與實踐

博客主頁面編寫

編寫思路
  1. 取出數(shù)據(jù)庫中所有文章對象
  2. 將文章對象打包成列表發(fā)送到前端
  3. 前端頁面以超鏈接的形式逐個列出
流程
  1. 后端

view.py中傳遞對象列表

def index(request):
    articles = models.Article.objects.all()
    return render(request, 'blog/index.html', {'articles':articles})
  1. 前端

通過模板for循環(huán)顯示

{% for xx in xxs %}
html語句
{%endfor%}

注意這里不是{{ }}而是{% %}
index.html

<html>

<head>

<title>my first html!</title>

</head>

<body>---
<h1>
    <a href="">新文章</a>
</h1>
{%for article in articles %}
    <a href="">{{article.title}}</a>
    <br>
{% endfor %}

</body>---

</html>

瀏覽器打開地址http://localhost:8000/blog/index/即可。

博客主頁面點擊鏈接進入文章

當點擊主頁面的文章標題后炉菲,跳轉(zhuǎn)到該文章頁面

流程
  1. 參數(shù)寫在響應函數(shù)request后堕战,可以有默認值

views.py

def article_page(request, article_id):
    article = models.Article.objects.get(pk=article_id)
    return render(request, 'blog/article.html', {'article':article})
  1. url正則表達式匹配

url.py

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

注意這里的組名:article_id>必須和article_page()中的形參article_id一致

  1. 寫對應的article.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article Page</title>
</head>
<body>
<h1>{{article.title}}</h1>
<br/>
<h3>{{article.content}}</h3>
<br/><br/>
<a herf="">修改文章</a>
</body>
</html>

瀏覽器輸入http://localhost:8000/blog/article/1可以打開索引為1的文章頁面。
但是index主頁面的超鏈接點擊沒有反應,需要額外的配置拍霜。

url鏈接配置
  1. 根url嘱丢,寫在include()的第二個參數(shù)位置,namespace = 'xxx'

myblog.urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^blog/', include('blog.urls', namespace='blog')),
]
  1. app的urls.pyurl() 第3個位置祠饺,name =xxx

blog.urls.py

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

index.html中的href配置

<html>

<head>

<title>my first html!</title>

</head>

<body>---
<h1>
    <a href="">新文章</a>
下</h1>
{%for article in articles %}
    <a href="{% url 'blog:article_page' article.id %}">{{article.title}}</a>
    <br>
{% endfor %}

</body>---

</html>

博客新建文章撰寫頁面

頁面內(nèi)容
  • 標題編輯欄
  • 文章內(nèi)容編輯區(qū)域
  • 提交按鈕
  • 后端獲取前端數(shù)據(jù)
  • 存入數(shù)據(jù)庫
流程
  1. 編寫頁面

(1) view.py

def edit_page(request):
    return render(request, 'blog/edit_page.html')

(2) 新建edit_page.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<form action="" method="post">
    <label>
        文章標題
        <input type="text" name="title"/>
    </label>
    <br/>
    <label>
        文章內(nèi)容
        <input type="text" name="content"/>
    </label>
     <br/>
     <br/>
    <input type="submit" />


</form>
</body>
</html>

注意這里<input type="text" name="content"/>name和后面post獲取該前端數(shù)據(jù)的key值必須相同越驻。

(3) urls.py

urlpatterns = [
    url(r'^edit/$', views.edit_page),
]

瀏覽器輸入http://localhost:8000/blog/edit/即可。

  1. 點擊提交按鈕后道偷,將前端頁面內(nèi)容返回給后端

(1) 使用request.POST['參數(shù)名']來獲取前端的表單數(shù)據(jù)
blog.views.py中編寫提交按鈕的響應函數(shù)

def submit_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})

注意這里post獲取該前端數(shù)據(jù)的key值titlecontent必須和html中的輸入框的name相同,比如<input type="text" name="content"/>

(2) 存入數(shù)據(jù)庫
models.Article.objects.create(title,content) 創(chuàng)建對象
(3) 配置url
blog.urls.py

urlpatterns = [
    url(r'^submit_action/$', views.submit_action, name='submit_action'),
]

(4)提交按鈕綁定url
edit_page.html中為表單添加url

<form action="{% url 'blog:submit_action'%}" method="post">
</form>

(5) 瀏覽器中點擊提交按鈕
訪問頁面會發(fā)現(xiàn)報錯:

禁止訪問 (403)
CSRF驗證失敗. 請求被中斷.

Django中通過POST提交表單的時候需要添加

 {% csrf_token %}

即:

<form action="{% url 'blog:submit_action'%}" method="post">
    {% csrf_token %}

博客已提交的文章重新編輯界面

重新編輯文章頁面有文章內(nèi)容勺鸦,而新建文章編輯頁面沒有文章內(nèi)容并巍。
重新編輯的文章有文章對象,對象id是數(shù)據(jù)庫存入自動生成的鍵值换途,從1開始的整形數(shù)據(jù)懊渡。
而新建文章的頁面,id可以傳入默認值0進行區(qū)分军拟。

  1. 修改html

index.html

  • 點擊新建文章返回0, 進入編輯頁面剃执。
  • 點擊已有文章,返回文章id吻谋,進入文章頁面忠蝗。
<h1>
    <a href="{% url 'blog:edit_page' 0 %}">新文章</a>
</h1>
{%for article in articles %}
    <a href="{% url 'blog:article_page' article.id %}">{{article.title}}</a>
    <br>
{% endfor %}

article.html

  • 文章頁面的編輯文章按鈕,返回當前文章id漓拾,進入編輯頁面
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article Page</title>
</head>
<body>
<h1>{{article.title}}</h1>
<br/>
<h3>{{article.content}}</h3>
<br/><br/>
<a href="{% url 'blog:edit_page' article.id %}">編輯文章</a>

</body>
</html>

edit_page.html

  • 如果編輯已有的文章阁最,后端會傳入article對象戒祠,更新前端的數(shù)據(jù)。
  • 通過新增hiddenarticle_id來標識提交的是新文章還是已有文章速种。
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<form action="{% url 'blog:submit_action'%}" method="post">
    {% csrf_token %}
    {% if article %}
        <input  type="hidden" name="article_id" value="{{article.id}}" >
        <label>
            文章標題
            <input type="text" name="title" value={{article.title}} />
        </label>
        <br/>
        <label>
            文章內(nèi)容
            <input type="text" name="content" value={{article.content}} />
        </label>
        <br/>
        <br/>

    {% else %}
        <input  type="hidden" name="article_id" value="0" >
        <label>
            文章標題
            <input type="text" name="title"/>
        </label>
        <br/>
        <label>
            文章內(nèi)容
            <input type="text" name="content"/>
        </label>
        <br/>
        <br/>
    {% endif %}
    <input type="submit", name="提交" />
</form>
</body>
</html>
  1. 修改view.py

(1) edit_page函數(shù)

  • 編輯已有文章姜盈,傳入article對象。
  • 編輯新建文章配阵,不傳article對象馏颂。
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})

(2) submit_action函數(shù)

  • article.html進入的編輯頁面,傳入的article_id不為0瘫拣,則更新數(shù)據(jù)庫的數(shù)據(jù)
  • index.html主頁面進入的新建文章的編輯頁面亿絮,傳入的article_id為0,創(chuàng)建新的數(shù)據(jù)庫對象麸拄。
def submit_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})
    else:
        article = models.Article.objects.get(pk=article_id)
        article.title = title
        article.content = content
        article.save()
        # 之前文章編輯后,返回文章頁面
        return render(request, 'blog/article.html', {'article': article})

(3)修改urls.py
views.edit_pageurl需要修改正則表達式

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

最后可以瀏覽器輸入地址http://localhost:8000/blog/index/進行測試了拢切。

Templates 過濾器

這里用過濾器將代碼進行優(yōu)化
過濾器使用方法:

{{value|filter}}

過濾器可疊加

{{value|filter1|filter2}}

比如

{{list_nums|length}}

edit_page.html中可以使用過濾器來簡化if else

<form action="{% url 'blog:submit_action'%}" method="post">
    {% csrf_token %}
    {% if article %}
        <input  type="hidden" name="article_id" value="{{article.id}}" >
        <label>
            文章標題
            <input type="text" name="title" value={{article.title}} />
        </label>
        <br/>
        <label>
            文章內(nèi)容
            <input type="text" name="content" value={{article.content}} />
        </label>
        <br/>
        <br/>

    {% else %}
        <input  type="hidden" name="article_id" value="0" >
        <label>
            文章標題
            <input type="text" name="title"/>
        </label>
        <br/>
        <label>
            文章內(nèi)容
            <input type="text" name="content"/>
        </label>
        <br/>
        <br/>
    {% endif %}
    <input type="submit", name="提交" />
</form>

改為

<form action="{% url 'blog:submit_action'%}" method="post">
    {% csrf_token %}
    <input  type="hidden" name="article_id" value="{{article.id|default:'0'}}" >
    <label>
        文章標題
        <input type="text" name="title" value="{{article.title}} "/>
    </label>
    <br/>
    <label>
        文章內(nèi)容
        <input type="text" name="content" value="{{article.content}}" />
    </label>
    <br/>
    <br/>

    <input type="submit", name="提交" />
</form>
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒂萎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子淮椰,更是在濱河造成了極大的恐慌五慈,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件主穗,死亡現(xiàn)場離奇詭異豺撑,居然都是意外死亡,警方通過查閱死者的電腦和手機黔牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門聪轿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人猾浦,你說我怎么就攤上這事陆错。” “怎么了金赦?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵音瓷,是天一觀的道長。 經(jīng)常有香客問我夹抗,道長绳慎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮杏愤,結果婚禮上靡砌,老公的妹妹穿的比我還像新娘。我一直安慰自己珊楼,他們只是感情好通殃,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著厕宗,像睡著了一般画舌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上已慢,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天曲聂,我揣著相機與錄音,去河邊找鬼佑惠。 笑死句葵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的兢仰。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼剂碴,長吁一口氣:“原來是場噩夢啊……” “哼把将!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忆矛,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤察蹲,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后催训,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體洽议,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年漫拭,在試婚紗的時候發(fā)現(xiàn)自己被綠了亚兄。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡采驻,死狀恐怖审胚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情礼旅,我是刑警寧澤膳叨,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站痘系,受9級特大地震影響菲嘴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一龄坪、第九天 我趴在偏房一處隱蔽的房頂上張望昭雌。 院中可真熱鬧,春花似錦悉默、人聲如沸城豁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽唱星。三九已至,卻和暖如春跟磨,著一層夾襖步出監(jiān)牢的瞬間间聊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工抵拘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哎榴,地道東北人。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓僵蛛,卻偏偏與公主長得像尚蝌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子充尉,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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

  • 去年的事情特別多飘言,也沒有什么時間充電學習。今年目測輕松一點驼侠,年初本來計劃就好好休息一下姿鸿,結果一晃2017就度過了一...
    灰豹兒閱讀 631評論 0 2
  • 本博客是記錄跟從慕課網(wǎng)課程所記下的筆記,更多內(nèi)容請訪問慕課網(wǎng)慕課網(wǎng)--項目源碼 新建項目 打開命令行倒源,進入到打算打...
    小白猿閱讀 2,270評論 1 10
  • 通過寫一個博客項目苛预,來串聯(lián)自己的知識點,并總結一些小的技巧 頁面介紹 1.博客主頁面 2.博客文章內(nèi)容頁面...
    be_keeper閱讀 699評論 0 0
  • 更換數(shù)據(jù)表mysql 上文說到編寫好了我們的 model 模塊笋熬,映射生成數(shù)據(jù)表热某,之前我們用的是Django 默認的...
    sixkery閱讀 717評論 0 12
  • 前面已經(jīng)對DTL(Django Template Language)語言基礎用法進行了講解,現(xiàn)在我們開始做一個博客...
    E思無邪閱讀 27,781評論 6 18