Django做一个简单的博客系统(12)----发表评论

前言

    添加一个发表评论功能.
    感谢大神的教程:Django搭建个人博客.

一.准备工作

    发表评论是一个相对独立的功能,所以再创建一个app:

python manager.py startapp comment

    然后在settings中注册这个app:

INSTALLED_APPS = [
    ...
    'comment',
]

    修改一下时间,还是在settings.py中:

TIME_ZONE = 'Asia/Shanghai'

    在Personal_blog中注册路由:
Personal_blog/urls.py

...
urlpatterns = [
    ...
    # 评论
    path('comment/', include('comment.url', namespace='comment')),
]
...

注:这里有很关键的一步,在注册好路由后,需要在comment目录下创建一个url.py文件,然后这个文件里一定要写上app_name = ‘comment’,要不然会报错的:

from django.urls import path,re_path
from comment import views

app_name = 'comment'    # 正在部署的应用的名称

urlpatterns = []

    准备工作就绪后,接下来就来实现发表评论功能.

二.发表评论

1.编写模型

comment/models.py:

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

# Create your models here.

# 模型中有2个外键:
# article是被评论的文章
# user是评论的发布者
# 博文的评论
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]

这里别忘了进行数据迁移

python manager.py makemigrations
python manager.py migrate
2.编写评论表单

comment/forms.py:

from django import forms
from comment.models import Comment

class CommentForm(forms.ModelForm):
    class Meta:
        # 因为模型中的两个外键将通过视图逻辑自动填写,
        # 所以这里只需要提交body就足够了
        model = Comment
        fields = ['body']
3.配置url

comment/url.py:

from django.urls import path,re_path
from comment import views

app_name = 'comment'    # 正在部署的应用的名称

urlpatterns = [
    # 发表评论
    path('post-comment/<int:article_id>',views.post_comment,name='post_comment'),
]
4.编写视图函数

comment/views.py:

from django.shortcuts import render,get_object_or_404,redirect,HttpResponse
from django.contrib.auth.decorators import login_required
from comment.models import Comment
from comment.form import CommentForm
from article.models import ArticlePost

# Create your views here.

# 文章评论
@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请求。")
5.修改文章模型

    在文章模型中添加get_absolute_url()方法:
article/models.py:

from django.db import models

# 导入内建的User模型
from django.contrib.auth.models import User
# timezone用于处理时间相关事务
from django.utils import timezone
from django.urls import reverse

# Create your models here.

# 博客文章数据类型
# 包括:文章作者,文章标题,文章正文,文章创建时间,文章更新时间
class ArticlePost(models.Model):
	...
	# 添加下面这个函数
    # 获取文章地址
    def get_absolute_url(self):
        return reverse('article:article_detail',args=[self.id])
6.修改文章详情视图

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 }

    ...
7.修改文章详情模板

templates/article/detail.html:

<!-- extends表明此页面继承自 base.html 文件 -->
{% extends "base.html" %}
{#加载静态文件#}
{% load staticfiles %}


{#写入title#}
{% block title %}
    文章详情
{% endblock %}

{#写入自定义content#}
{% block content %}
    <div class="container">
        <div class="row">
            <!-- 标题及作者 -->
            <h1 class="col-12 mt-4 mb-4">{{ article.title }}</h1>
            <div class="col-12 alert alert-success">
            <div>
                作者:{{ article.author }}
                {% if user == article.author %}
                    · <a href="#" onclick="confirm_delete()">删除文章</a>
                    · <a href="{% url "article:article_update" article.id %}">
                        编辑文章
                    </a>
                {% endif %}
            </div>
                <div>
                    浏览:{{ article.total_views }}
                </div>
            </div>

            <!-- 文章正文 -->
            <div class="col-12">
                <p>{{ article.body|safe }}</p>
            </div>
        </div>
        <!-- 发表评论 -->
    <hr>
    {% if user.is_authenticated %}
        <div>
            <form
                action="{% url 'comment:post_comment' article.id %}"
                method="POST"
            >
            {% csrf_token %}
                <div class="form-group">
                    <label for="body">
                        <strong>
                            我也要发言:
                        </strong>
                    </label>
                    <textarea
                        type="text"
                        class="form-control"
                        id="body"
                        name="body"
                        rows="2"></textarea>
                </div>
                <!-- 提交按钮 -->
                <button type="submit" class="btn btn-primary ">发送</button>
            </form>
        </div>
        <br>
    {% else %}
        <br>
        <h5 class="row justify-content-center"><a href="{% url 'userprofile:login' %}">登录</a>后回复
        </h5>
        <br>
    {% endif %}



    <!-- 显示评论 -->
    <h4>共有{{ comments.count }}条评论</h4>
    <div>
        {% for comment in comments %}
            <hr>
            <p>
                <strong style="color: pink">
                    {{ comment.user }}
                </strong><span style="color: green">
                    {{ comment.created|date:"Y-m-d H:i:s" }}
                </span> 时说:
            </p>
            <pre style="font-family: inherit; font-size: 1em;">
{{ comment.body }}</pre>
        {% endfor %}
    </div>
    </div>



    {#   新增一个隐藏的表单 #}
    <form
        style="display:none;"
        id="safe_delete"
        action="{% url 'article:article_safe_delete' article.id %}"
        method="POST"
        >
        {% csrf_token %}
        <button type="submit">发送</button>
    </form>


    <script>
        {# 删除文章函数       #}
            function confirm_safe_delete() {
                layer.open({
                    title: "确认删除",
                    content: "确认删除这篇文章吗?",
                    yes: function(index, layero) {
                        $('form#safe_delete button').click();
                        layer.close(index);
                    }
                })
            }
    </script>

{% endblock %}

    这样,一个简单的评论功能就完成了.

写在最后

    本文是个人的一些学习笔记,如有侵权,请及时联系我进行删除,谢谢大家.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用Django来构建一个个人博客网站。你可以使用Django的内置功能来创建文章、评论用户账户和其他功能。你可以使用Django的模板语言来自定义你的网站,也可以使用第三方库来帮助构建你的个人博客网站。 ### 回答2: 个人博客一个非常流行的网络平台,让用户可以分享自己的观点、经验和技能。Django一个使用Python编写的高级Web开发框架,它提供了强大的功能和易于使用的工具,适用于构建个人博客。 在使用Django构建个人博客时,我们需要首先创建一个Django项目,并配置好相应的数据库连接。接下来,我们可以定义一个模型来表示博客的内容,包括标题、作者、内容和发布日期等。通过使用Django提供的ORM(对象关系映射)功能,我们可以轻松地操作数据库。 在管理界面中,Django为我们提供了一个强大而简洁的后台管理系统。我们可以通过自定义模型的管理类来定义后台的显示和操作方式。这使得我们可以方便地管理和编辑博客的内容,而无需编写复杂的HTML和CSS代码。 在前端方面,我们可以使用Django提供的模板引擎来创建博客的界面。通过编写模板文件,我们可以定义博客的布局和样式,并将动态数据传递给模板进行渲染。同时,Django还提供了静态文件处理功能,使得我们可以轻松地管理和加载CSS和JavaScript文件。 除了基本的博客功能,我们还可以使用Django的扩展功能来实现更多的特性。例如,我们可以使用认证系统来实现用户登录和注册,使用分页功能来管理博客的列表显示,使用评论功能和标签功能来增强博客的互动性和可读性。 总的来说,Django一个非常适合构建个人博客的框架。它提供了强大的功能和易于使用的工具,使得我们可以快速地搭建和管理个人博客,并且具有良好的扩展性和可定制性。无论是初学者还是有经验的开发者,都可以通过学习和使用Django来创建自己的个人博客。 ### 回答3: 个人博客一个非常流行的网络应用程序,许多人使用它们来分享自己的观点、经验和兴趣。使用Django可以很方便地创建一个个人博客网站。 首先,我们需要建立一个Django项目,并创建一个用于存储博客文章的数据库模型。数据库模型可以包括文章标题、内容、作者和发布日期等字段。 然后,我们可以利用Django的视图功能来创建一个首页,用于显示最新发布的博客文章的摘要或列表。用户可以点击文章标题或“阅读更多”按钮来访问完整的文章内容。 为了使用户能够发布新的博客文章,我们可以创建一个发布页面。该页面包含一个表单,用户可以输入文章的标题和内容,并提交保存。 为了保护用户数据,我们可以使用Django用户认证系统进行用户注册和登录。这样,用户可以创建自己的账户,并在登录后才能发布和管理自己的博客文章。 为了增加用户交互性,我们可以添加评论功能。用户可以在文章下方发表自己的评论,并与其他读者进行讨论。 除了基本的博客功能,我们还可以添加其他有趣的功能,如分类、标签、搜索等。这些功能可以帮助用户更好地组织和浏览博客内容。 最后,我们可以设计一个美观的博客模板,用于展示博客文章和界面。这可以通过使用Django模板语言和CSS样式来实现。 总结而言,使用Django可以很方便地创建个人博客网站。通过构建数据库模型、视图、表单和用户认证系统,我们可以实现基本的博客功能。同时,还可以添加其他有趣的功能和美观的界面,为用户提供更好的博客体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值