成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Django搭建個(gè)人博客:在博文中發(fā)表評(píng)論

Jinkey / 1912人閱讀

摘要:確認(rèn)創(chuàng)建成功后,記得在中注冊(cè)因?yàn)槲覀兿腼@示發(fā)表評(píng)論的時(shí)間,修改時(shí)區(qū)設(shè)置為上海的時(shí)區(qū)。處理錯(cuò)誤請(qǐng)求發(fā)表評(píng)論僅接受請(qǐng)求。返回到一個(gè)適當(dāng)?shù)闹屑从脩?hù)發(fā)送評(píng)論后,重新定向到文章詳情頁(yè)面??偨Y(jié)本章實(shí)現(xiàn)了發(fā)表評(píng)論展示評(píng)論的功能。

在沒(méi)有互聯(lián)網(wǎng)的年代,我們用日記來(lái)記錄每天的心得體會(huì)。小的時(shí)候我有一個(gè)帶鎖的日記本,生怕被別人看見(jiàn)里面寫(xiě)了啥,鑰匙藏得那叫一個(gè)絕。

現(xiàn)在時(shí)代變了,網(wǎng)絡(luò)版的日記本:博客,卻巴不得越多人看越好。

別人看完你寫(xiě)的深度好文,難免也想高談闊論一番,這就是“評(píng)論”功能。

本章將要編寫(xiě)的評(píng)論模塊,幾乎沒(méi)有新的知識(shí)點(diǎn),而是將前面章節(jié)內(nèi)容的綜合應(yīng)用。

強(qiáng)烈建議讀者自行嘗試編寫(xiě)這部分內(nèi)容,測(cè)試自己的知識(shí)掌握程度。

準(zhǔn)備工作

評(píng)論是一個(gè)相對(duì)獨(dú)立的功能,因此新建一個(gè)評(píng)論的app:

(env) E:django_projectmy_blog > ppython manage.py startapp comment
有的人覺(jué)得奇怪,沒(méi)有博文就沒(méi)有評(píng)論,為什么說(shuō)評(píng)論是“獨(dú)立”的功能?

那是因?yàn)椴粌H博文可以評(píng)論,照片、視頻甚至網(wǎng)站本身都可以“被評(píng)論”。將其封裝成多帶帶的模塊方便以后的擴(kuò)展。

確認(rèn)app創(chuàng)建成功后,記得在settings.py中注冊(cè):

my_blog/settings.py

...
INSTALLED_APPS = [
    ...
    "comment",
]
...

TIME_ZONE = "Asia/Shanghai"

...

因?yàn)槲覀兿腼@示發(fā)表評(píng)論的時(shí)間,修改時(shí)區(qū)設(shè)置TIME_ZONE為上海的時(shí)區(qū)。

然后在my_blog/urls.py中注冊(cè)根路由:

my_blog/urls.py

...
urlpatterns = [
    ...
    # 評(píng)論
    path("comment/", include("comment.urls", namespace="comment")),
]
...
編寫(xiě)核心功能 評(píng)論的模型

首先編寫(xiě)評(píng)論的模型:

comment/models.py

from django.db import models
from django.contrib.auth.models import User
from article.models import ArticlePost

# 博文的評(píng)論
class Comment(models.Model):
    article = models.ForeignKey(
        ArticlePost,
        on_delete=models.CASCADE,
        related_name="comments"
    )
    user = models.ForeignKey(
        User, 
        on_delete=models.CASCADE, 
        related_name="comments"
    )
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ("created",)

    def __str__(self):
        return self.body[:20]

模型中共有2個(gè)外鍵:

article是被評(píng)論的文章

user是評(píng)論的發(fā)布者

別忘了每次新增、修改Model后,必須數(shù)據(jù)遷移。

提示:你必須先在setting.py中注冊(cè)app,這個(gè)app中的數(shù)據(jù)遷移才能生效
評(píng)論的表單

用戶(hù)提交評(píng)論時(shí)會(huì)用到表單,因此新建表單類(lèi):

comment/forms.py

from django import forms
from .models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        model = Comment
        fields = ["body"]

因?yàn)槟P椭械?個(gè)外鍵將通過(guò)視圖邏輯自動(dòng)填寫(xiě),所以這里只需要提交body就足夠了。

評(píng)論的url

在comment app中新建路由文件:

comment/urls.py

from django.urls import path
from . import views

app_name = "comment"

urlpatterns = [
    # 發(fā)表評(píng)論
    path("post-comment//", views.post_comment, name="post_comment"),
]

評(píng)論必須關(guān)聯(lián)在某篇具體的博文里,因此傳入博文的id,方便后續(xù)調(diào)用。

post_comment()視圖還沒(méi)寫(xiě),先取個(gè)名字占位置。

評(píng)論的視圖

評(píng)論的視圖函數(shù)如下:

comment/views.py

from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.http import HttpResponse

from article.models import ArticlePost
from .forms import CommentForm

# 文章評(píng)論
@login_required(login_url="/userprofile/login/")
def post_comment(request, article_id):
    article = get_object_or_404(ArticlePost, id=article_id)

    # 處理 POST 請(qǐng)求
    if request.method == "POST":
        comment_form = CommentForm(request.POST)
        if comment_form.is_valid():
            new_comment = comment_form.save(commit=False)
            new_comment.article = article
            new_comment.user = request.user
            new_comment.save()
            return redirect(article)
        else:
            return HttpResponse("表單內(nèi)容有誤,請(qǐng)重新填寫(xiě)。")
    # 處理錯(cuò)誤請(qǐng)求
    else:
        return HttpResponse("發(fā)表評(píng)論僅接受POST請(qǐng)求。")

代碼中有2個(gè)新面孔。

get_object_or_404():它和Model.objects.get()的功能基本是相同的。區(qū)別是在生產(chǎn)環(huán)境下,如果用戶(hù)請(qǐng)求一個(gè)不存在的對(duì)象時(shí),Model.objects.get()會(huì)返回Error 500(服務(wù)器內(nèi)部錯(cuò)誤),而get_object_or_404()會(huì)返回Error 404。相比之下,返回404錯(cuò)誤更加的準(zhǔn)確。

redirect():返回到一個(gè)適當(dāng)?shù)膗rl中:即用戶(hù)發(fā)送評(píng)論后,重新定向到文章詳情頁(yè)面。當(dāng)其參數(shù)是一個(gè)Model對(duì)象時(shí),會(huì)自動(dòng)調(diào)用這個(gè)Model對(duì)象的get_absolute_url()方法。因此接下來(lái)馬上修改article的模型。

實(shí)際上之前的章節(jié)已經(jīng)用過(guò)redirect()了。功能是相同的,實(shí)現(xiàn)上略有區(qū)別。
文章的模型

按照上面說(shuō)的,在文章模型中添加get_absolute_url()方法:

article/models.py

...
# 記得導(dǎo)入
from django.urls import reverse

class ArticlePost(models.Model):
    ...

    # 獲取文章地址
    def get_absolute_url(self):
        return reverse("article:article_detail", args=[self.id])

通過(guò)reverse()方法返回文章詳情頁(yè)面的url,實(shí)現(xiàn)了路由重定向。

文章詳情視圖

評(píng)論模塊需要在文章詳情頁(yè)面展示,所以必須把評(píng)論模塊的上下文也傳遞到模板中。

因此修改article/views.py中的article_detail()

article/views.py

...

from comment.models import Comment

def article_detail(request, id):
    # 已有代碼
    article = ArticlePost.objects.get(id=id)

    # 取出文章評(píng)論
    comments = Comment.objects.filter(article=id)
    ...
    
    # 添加comments上下文
    context = { "article": article, "toc": md.toc, "comments": comments }

    ...
filter()可以取出多個(gè)滿(mǎn)足條件的對(duì)象,而get()只能取出1個(gè),注意區(qū)分使用
文章詳情模板

到最后一步了,堅(jiān)持。所有后臺(tái)的功能已經(jīng)寫(xiě)完了,就差把所有這些展現(xiàn)到頁(yè)面中了。

修改文章詳情頁(yè)面:

templates/article/detail.html

...

...
...

{% if user.is_authenticated %}
{% csrf_token %}

{% else %}
請(qǐng)登錄后回復(fù)

{% endif %}

共有{{ comments.count }}條評(píng)論

{% for comment in comments %}

{{ comment.user }} {{ comment.created|date:"Y-m-d H:i:s" }} 時(shí)說(shuō):

{{ comment.body }}
{% endfor %}
...
...

表單組件中的action指定數(shù)據(jù)提交到哪個(gè)url中

顯示評(píng)論中的comments.count是模板對(duì)象中內(nèi)置的方法,對(duì)包含的元素進(jìn)行計(jì)數(shù)

|date:"Y-m-d H:i:s":管道符你已經(jīng)很熟悉了,用于給對(duì)象“粘貼”某些屬性或功能。這里用于格式化日期的顯示方式。請(qǐng)嘗試修改其中的某些字符試試效果。

定義預(yù)格式化的文本,在我們的項(xiàng)目中最關(guān)鍵的作用是保留空格和換行符。該標(biāo)簽會(huì)改變文字的字體、大小等,因此用style屬性重新定義相關(guān)內(nèi)容。嘗試將
替換為div,輸入多行文本試試效果。

之前說(shuō)代碼最好不要復(fù)制粘貼,否則有些“小坑”你是留意不到的。比如在
標(biāo)簽中的文本千萬(wàn)不能縮進(jìn)。

測(cè)試

又到了激動(dòng)人心的測(cè)試環(huán)節(jié)了。

登錄自己的賬戶(hù),進(jìn)入某個(gè)文章詳情頁(yè)面,發(fā)現(xiàn)已經(jīng)可以進(jìn)行留言了:

如果退出登錄,顯示提示語(yǔ):

點(diǎn)擊登錄就回到登錄頁(yè)面。

評(píng)論模塊的發(fā)布、展示功能就搞定了。

掃尾工作

數(shù)據(jù)的刪、改功能我們已經(jīng)做過(guò)很多遍,這里不打算再贅述了。

評(píng)論同樣也可以支持Markdown語(yǔ)法,或者插入Emoji表情符號(hào)。

讀者可以自己去實(shí)現(xiàn)感興趣的功能。

有些網(wǎng)站干脆就沒(méi)有刪除、更新評(píng)論的功能。因?yàn)閷?duì)小站來(lái)說(shuō),這些功能用到的次數(shù)太少太少了,不如把精力用在更有價(jià)值的地方去。比如我的博客就沒(méi)有。

還有的網(wǎng)站提供軟刪除,刪除后僅僅是不顯示而已,實(shí)際上數(shù)據(jù)還存在。

具體應(yīng)該如何做,都以你的喜好而定。

總結(jié)

本章實(shí)現(xiàn)了發(fā)表評(píng)論、展示評(píng)論的功能。像開(kāi)頭說(shuō)的一樣,本章的內(nèi)容是前面所學(xué)章節(jié)的綜合。

如果你沒(méi)有看本章代碼,而是完全靠自己完成了評(píng)論功能,那么恭喜你獲得了“Django入門(mén)程序員”的稱(chēng)號(hào)!不要小看“入門(mén)”兩字,萬(wàn)事開(kāi)頭難嘛。

有疑問(wèn)請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。

或Email私信我:[email protected]

項(xiàng)目完整代碼:Django_blog_tutorial

轉(zhuǎn)載請(qǐng)注明出處。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42908.html

相關(guān)文章

  • Django搭建個(gè)人博客:錨點(diǎn)定位

    摘要:在父頁(yè)面中文章詳情模板添加需要執(zhí)行錨點(diǎn)拼接的函數(shù)新增函數(shù),處理二級(jí)回復(fù)去除尾部符號(hào)刷新并定位到錨點(diǎn)函數(shù)中運(yùn)用了的三元運(yùn)算符,翻譯成人話就是如果成立則返回,如果不成立就返回。 老讀者注意:上一章消息通知有個(gè)bug,即發(fā)給管理員的notify必須移動(dòng)到new_comment.save()的后面,否則會(huì)導(dǎo)致action_object存儲(chǔ)為NULL,并且導(dǎo)致本章的html拼接錨點(diǎn)失效。原文已...

    xi4oh4o 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:用django-notifications實(shí)現(xiàn)消息通知

    摘要:接下來(lái)你就可以在項(xiàng)目的任何地方發(fā)送通知了像這樣其中的參數(shù)釋義發(fā)送通知的對(duì)象接收通知的對(duì)象動(dòng)詞短語(yǔ)鏈接到動(dòng)作的對(duì)象可選執(zhí)行通知的對(duì)象可選有點(diǎn)繞,舉個(gè)栗子杜賽在搭建個(gè)人博客中對(duì)你發(fā)表了評(píng)論。有疑問(wèn)請(qǐng)?jiān)诙刨惖膫€(gè)人網(wǎng)站留言,我會(huì)盡快回復(fù)。 憑借你勤奮的寫(xiě)作,拜讀你文章的用戶(hù)越來(lái)越多,他們的評(píng)論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復(fù)。 怎么...

    Zoom 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:使用django-ckeditor富文本編輯器

    摘要:后面兩個(gè)編輯器自帶,不用單獨(dú)下載,添上就可以了添加相關(guān)插件這樣就完成了代碼高亮效果不錯(cuò)在前臺(tái)使用為了讓用戶(hù)在前臺(tái)也能使用富文本編輯器,還得對(duì)代碼稍加改動(dòng)。對(duì)于有些不喜歡的人來(lái)說(shuō),甚至可以連博文都使用提供的富文本編輯器。 前面我們已經(jīng)實(shí)現(xiàn)了用Markdown語(yǔ)法寫(xiě)文章了。但是文章的評(píng)論用Markdown就不太合適了,你不能強(qiáng)求用戶(hù)也花時(shí)間去熟悉語(yǔ)法啊。另外評(píng)論中通常還有表情、帶顏色的字體...

    beanlam 評(píng)論0 收藏0
  • Django搭建個(gè)人博客:結(jié)束和開(kāi)始

    摘要:教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容搭建開(kāi)發(fā)環(huán)境博文管理用戶(hù)管理發(fā)表評(píng)論若干小功能搭建簡(jiǎn)單的小博客,以上的功能夠用了。教程為了起步平緩,沒(méi)有展開(kāi)這方面的內(nèi)容。陌生人,祝你學(xué)業(yè)進(jìn)步事業(yè)有成歡迎常到杜賽的個(gè)人網(wǎng)站做客 教程看到這里,你已經(jīng)學(xué)會(huì)如下內(nèi)容: 搭建開(kāi)發(fā)環(huán)境 博文管理 用戶(hù)管理 發(fā)表評(píng)論 若干小功能 搭建簡(jiǎn)單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個(gè)個(gè)造火...

    zqhxuyuan 評(píng)論0 收藏0
  • 使用 django-blog-zinnia 搭建個(gè)人博客

    摘要:語(yǔ)法支持再次打開(kāi)文件,在文件的最后添加指明了使用語(yǔ)法標(biāo)記,做了兩個(gè)拓展,其中表示支持語(yǔ)法高亮,包含的特性請(qǐng)參見(jiàn)相關(guān)文檔。語(yǔ)法高亮支持注意這一步必須在安裝完主題之后。 目前網(wǎng)上搭建個(gè)人博客的方案很多,雖然使用諸如 Wordpress ( PHP )、Hexo ( Node.js ) 等可以方便快速地搭建一款功能齊全的高性能個(gè)人博客,但是本文將嘗試一種更為小眾化的方案 —— 一款基于 dj...

    褰辯話 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<