国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Django搭建個人博客:在博文中發表評論

Jinkey / 1881人閱讀

摘要:確認創建成功后,記得在中注冊因為我們想顯示發表評論的時間,修改時區設置為上海的時區。處理錯誤請求發表評論僅接受請求。返回到一個適當的中即用戶發送評論后,重新定向到文章詳情頁面。總結本章實現了發表評論展示評論的功能。

在沒有互聯網的年代,我們用日記來記錄每天的心得體會。小的時候我有一個帶鎖的日記本,生怕被別人看見里面寫了啥,鑰匙藏得那叫一個絕。

現在時代變了,網絡版的日記本:博客,卻巴不得越多人看越好。

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

本章將要編寫的評論模塊,幾乎沒有新的知識點,而是將前面章節內容的綜合應用。

強烈建議讀者自行嘗試編寫這部分內容,測試自己的知識掌握程度。

準備工作

評論是一個相對獨立的功能,因此新建一個評論的app:

(env) E:django_projectmy_blog > ppython manage.py startapp comment
有的人覺得奇怪,沒有博文就沒有評論,為什么說評論是“獨立”的功能?

那是因為不僅博文可以評論,照片、視頻甚至網站本身都可以“被評論”。將其封裝成多帶帶的模塊方便以后的擴展。

確認app創建成功后,記得在settings.py中注冊:

my_blog/settings.py

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

TIME_ZONE = "Asia/Shanghai"

...

因為我們想顯示發表評論的時間,修改時區設置TIME_ZONE為上海的時區。

然后在my_blog/urls.py中注冊根路由:

my_blog/urls.py

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

首先編寫評論的模型:

comment/models.py

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

# 博文的評論
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個外鍵:

article是被評論的文章

user是評論的發布者

別忘了每次新增、修改Model后,必須數據遷移

提示:你必須先在setting.py中注冊app,這個app中的數據遷移才能生效
評論的表單

用戶提交評論時會用到表單,因此新建表單類:

comment/forms.py

from django import forms
from .models import Comment

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

因為模型中的2個外鍵將通過視圖邏輯自動填寫,所以這里只需要提交body就足夠了。

評論的url

在comment app中新建路由文件:

comment/urls.py

from django.urls import path
from . import views

app_name = "comment"

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

評論必須關聯在某篇具體的博文里,因此傳入博文的id,方便后續調用。

post_comment()視圖還沒寫,先取個名字占位置。

評論的視圖

評論的視圖函數如下:

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

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

    # 處理 POST 請求
    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("表單內容有誤,請重新填寫。")
    # 處理錯誤請求
    else:
        return HttpResponse("發表評論僅接受POST請求。")

代碼中有2個新面孔。

get_object_or_404():它和Model.objects.get()的功能基本是相同的。區別是在生產環境下,如果用戶請求一個不存在的對象時,Model.objects.get()會返回Error 500(服務器內部錯誤),而get_object_or_404()會返回Error 404。相比之下,返回404錯誤更加的準確。

redirect():返回到一個適當的url中:即用戶發送評論后,重新定向到文章詳情頁面。當其參數是一個Model對象時,會自動調用這個Model對象的get_absolute_url()方法。因此接下來馬上修改article的模型。

實際上之前的章節已經用過redirect()了。功能是相同的,實現上略有區別。
文章的模型

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

article/models.py

...
# 記得導入
from django.urls import reverse

class ArticlePost(models.Model):
    ...

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

通過reverse()方法返回文章詳情頁面的url,實現了路由重定向。

文章詳情視圖

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

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

article/views.py

...

from comment.models import Comment

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

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

    ...
filter()可以取出多個滿足條件的對象,而get()只能取出1個,注意區分使用
文章詳情模板

到最后一步了,堅持。所有后臺的功能已經寫完了,就差把所有這些展現到頁面中了。

修改文章詳情頁面:

templates/article/detail.html

...

...
...

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

{% else %}
登錄后回復

{% endif %}

共有{{ comments.count }}條評論

{% for comment in comments %}

{{ comment.user }} {{ comment.created|date:"Y-m-d H:i:s" }} 時說:

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

表單組件中的action指定數據提交到哪個url中

顯示評論中的comments.count是模板對象中內置的方法,對包含的元素進行計數

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

定義預格式化的文本,在我們的項目中最關鍵的作用是保留空格和換行符。該標簽會改變文字的字體、大小等,因此用style屬性重新定義相關內容。嘗試將
替換為div,輸入多行文本試試效果。

之前說代碼最好不要復制粘貼,否則有些“小坑”你是留意不到的。比如在
標簽中的文本千萬不能縮進。

測試

又到了激動人心的測試環節了。

登錄自己的賬戶,進入某個文章詳情頁面,發現已經可以進行留言了:

如果退出登錄,顯示提示語:

點擊登錄就回到登錄頁面。

評論模塊的發布、展示功能就搞定了。

掃尾工作

數據的刪、改功能我們已經做過很多遍,這里不打算再贅述了。

評論同樣也可以支持Markdown語法,或者插入Emoji表情符號。

讀者可以自己去實現感興趣的功能。

有些網站干脆就沒有刪除、更新評論的功能。因為對小站來說,這些功能用到的次數太少太少了,不如把精力用在更有價值的地方去。比如我的博客就沒有。

還有的網站提供軟刪除,刪除后僅僅是不顯示而已,實際上數據還存在。

具體應該如何做,都以你的喜好而定。

總結

本章實現了發表評論、展示評論的功能。像開頭說的一樣,本章的內容是前面所學章節的綜合。

如果你沒有看本章代碼,而是完全靠自己完成了評論功能,那么恭喜你獲得了“Django入門程序員”的稱號!不要小看“入門”兩字,萬事開頭難嘛。

有疑問請在杜賽的個人網站留言,我會盡快回復。

或Email私信我:dusaiphoto@foxmail.com

項目完整代碼:Django_blog_tutorial

轉載請注明出處。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42908.html

相關文章

  • Django搭建個人博客:錨點定位

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

    xi4oh4o 評論0 收藏0
  • Django搭建個人博客:用django-notifications實現消息通知

    摘要:接下來你就可以在項目的任何地方發送通知了像這樣其中的參數釋義發送通知的對象接收通知的對象動詞短語鏈接到動作的對象可選執行通知的對象可選有點繞,舉個栗子杜賽在搭建個人博客中對你發表了評論。有疑問請在杜賽的個人網站留言,我會盡快回復。 憑借你勤奮的寫作,拜讀你文章的用戶越來越多,他們的評論也分散在眾多的文章之中。作為博主,讀者的留言肯定是要都看的;而讀者給你留言,自然也希望得到回復。 怎么...

    Zoom 評論0 收藏0
  • Django搭建個人博客:使用django-ckeditor富文本編輯器

    摘要:后面兩個編輯器自帶,不用單獨下載,添上就可以了添加相關插件這樣就完成了代碼高亮效果不錯在前臺使用為了讓用戶在前臺也能使用富文本編輯器,還得對代碼稍加改動。對于有些不喜歡的人來說,甚至可以連博文都使用提供的富文本編輯器。 前面我們已經實現了用Markdown語法寫文章了。但是文章的評論用Markdown就不太合適了,你不能強求用戶也花時間去熟悉語法啊。另外評論中通常還有表情、帶顏色的字體...

    beanlam 評論0 收藏0
  • Django搭建個人博客:結束和開始

    摘要:教程看到這里,你已經學會如下內容搭建開發環境博文管理用戶管理發表評論若干小功能搭建簡單的小博客,以上的功能夠用了。教程為了起步平緩,沒有展開這方面的內容。陌生人,祝你學業進步事業有成歡迎常到杜賽的個人網站做客 教程看到這里,你已經學會如下內容: 搭建開發環境 博文管理 用戶管理 發表評論 若干小功能 搭建簡單的小博客,以上的功能夠用了。 相信你的志向不止于此。畢竟程序員面試個個造火...

    zqhxuyuan 評論0 收藏0
  • 使用 django-blog-zinnia 搭建個人博客

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

    褰辯話 評論0 收藏0

發表評論

0條評論

Jinkey

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<