基于Django contrib Comments 评论模块(详解)

完整攻略:基于Django contrib Comments 评论模块(详解)

  1. 安装Django contrib
    首先,在你的Django项目中安装Django contrib:
pip install django-contrib-comments
  1. 添加评论到你的模型中
    在你的模型中,你需要导入comments模块,然后在你的模型中添加一个评论字段,例如:
from django.contrib.comments.models import Comment

class MyModel(models.Model):
    name = models.CharField(max_length=100)
    ...
    comments = GenericRelation(Comment, related_query_name='mymodel_comments')
  1. 将评论标签添加到你的模板中
    在你想要显示评论的模板中,你需要在<html>标记中导入评论模板标签,例如:
{% load comments %}

之后在你希望出现评论的地方添加以下标签:

{% load comments %}
...
{% render_comment_list for mymodel %}

其中mymodel是你要渲染评论的模型的名字。

  1. 允许用户发表评论
    要让用户在你的网站上发表评论,你需要在你的form中添加一个CommentForm字段,例如:
from django.contrib.comments.forms import CommentForm

class MyForm(forms.ModelForm):
    ...
    comment = CommentForm()

然后,在你的视图中,你需要将这个form传递给你想要让用户评论的模型的视图中,例如:

from django.shortcuts import render
from django.contrib.comments.views.comments import CommentPostBadRequest
from django.contrib.contenttypes.models import ContentType

from .models import MyModel
from .forms import MyForm

def mymodel_detail(request, pk):
    mymodel = MyModel.objects.get(pk=pk)
    ct = ContentType.objects.get_for_model(mymodel)
    form = MyForm(request.POST or None)

    if request.method == 'POST' and form.is_valid():
        comment = form.cleaned_data['comment']
        comment = Comment.objects.create(
            content_type=ct,
            object_pk=mymodel.pk,
            comment=comment,
            user=request.user
        )

        return redirect(mymodel.get_absolute_url())

    else:
        context = {
            'mymodel': mymodel,
            'form': form,
        }

    return render(request, 'mymodel_detail.html', context)

在这个视图中,我们首先获取了我们想要评论的MyModel实例,然后为这个实例获取ContentType对象,因为我们需要把评论和这个对象关联起来。如果获取数据的方式是POST请求,我们验证评论并创建一个新的Comment对象。最后,我们将用户重定向到评论后的页面。如果有错误或请求数据无效,我们需要将错误显示给用户。

  1. 实现用户审核评论
    从安全角度考虑,你可能希望在您的网站发布评论之前,对评论内容进行审核。Django contrib的评论模块默认情况下是未经验证的,但你可以通过一个信号comment_was_posted来通知管理员有人发表了一个新评论。首先,你需要在你的app中创建一个signals.py文件,并将信号添加到里面:
from django.core.mail import mail_admins
from django.db.models.signals import Signal
from django.dispatch import receiver
from django.contrib.comments.models import Comment

comment_was_posted = Signal(providing_args=['comment'])

@receiver(comment_was_posted, sender=Comment)
def comment_notification(sender, **kwargs):
    mail_admins(
        subject='New comment on your site',
        message='Please moderate: {}'.format(kwargs['comment'].get_absolute_url())
    )

根据这个设置,每当有新的评论被发布时,管理员将会收到一份包含发表评论的链接的电子邮件。你可以选择添加更多的验证步骤,比如在comment_notification方法里面验证评论的内容或者是否是敏感信息,然后在邮件中包含更多的信息。

示例一:显示评论

如果你已经安装了Django contrib并将评论添加到你的模型中,你可以按照以下方式在网站上显示评论:

{% load comments %}
...
{% render_comment_list for mymodel %}

其中mymodel是你想要显示评论的模型的实例。

示例二:创建评论

如果你想让用户在你的网站上创建评论,你需要做以下几个步骤:

  1. 创建一个模版,其中包含一个表单用于创建评论,例如:
<form method="POST" action="{% url 'mymodel_detail' mymodel.pk %}">
    {% csrf_token %}
    {{ form.as_p }}
    <button type="submit">Submit</button>
</form>
  1. 写一个视图用于处理表单数据,并将它添加到你的模型的详情页面中,例如:
from django.shortcuts import render, redirect
from django.contrib.comments.models import Comment
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.decorators import login_required

from .models import MyModel
from .forms import MyForm

@login_required
def mymodel_detail(request, pk):
    mymodel = MyModel.objects.get(pk=pk)
    ct = ContentType.objects.get_for_model(mymodel)
    form = MyForm(request.POST or None)

    if request.method == 'POST' and form.is_valid():
        comment = form.cleaned_data['comment']
        comment = Comment.objects.create(
            content_type=ct,
            object_pk=mymodel.pk,
            comment=comment,
            user=request.user
        )

        return redirect(mymodel.get_absolute_url())

    else:
        context = {
            'mymodel': mymodel,
            'form': form,
        }

    return render(request, 'mymodel_detail.html', context)

其中,我们使用Comment.objects.create来在提交表单之后创建一个新的评论对象。根据你的需求,你可以检查评论的内容并添加其他验证步骤,比如在发送通知电子邮件之前对内容进行审查,还可以限制用户可以使用的标记和HTML标签。

总结
使用Django contrib的评论模块可以为你的Django项目添加方便快捷的评论系统,可以通过简单的修改和自定义来满足各种需求。通过添加额外的功能,例如邮件通知,你可以进一步优化安全性和使用体验。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于Django contrib Comments 评论模块(详解) - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • Django框架组成结构、基本概念与文件功能分析

    Django 是一个高效、稳定、功能全面的 Python Web 框架,它已经成为了市面上最受欢迎的 Web 框架之一,广泛用于各种大中小型的 Web 应用程序开发。Django 的架构设计思想清晰,易于理解和使用,也便于实现多种 Web 应用程序的构建。 在这里,我们将详细讲解 Django 框架的组成结构、基本概念和文件功能,以及通过两个示例说明来让大家…

    Django 2023年5月15日
    00
  • linux Vue+nginx+django 实现前后端分离

    示例项目 — LuffyCity.com 的上线 具体解释,vue前端提供静态页面,且可以向后台发起get,post等restful请求 django后台提供数据支撑,返回json数据,返回给vue,进行数据页面渲染 下面是部署笔记: — 先从后端搞起 解决环境依赖 — 解决环境依赖的办法: 1 挨个报错的处理 2 pip3 freeze >re…

    Django 2023年4月12日
    00
  • jQuery的ajax与django传参

    Django中的代码如下: urls.py代码: from django.conf.urls import url from django.contrib import admin import AjaxTest.views urlpatterns = [ url(r’^admin/’, admin.site.urls), url(r”^index/$”,A…

    Django 2023年4月13日
    00
  • 【服务后端】MySQL数据库与Django Models不一致问题解决

    1 背景 1.8 Django的APP目录下有makemigrations文件夹,这个文件夹中的文件误删除过,后面从其他电脑的工程目录中拷贝了过来。 进行了python manage.py makemigrations和python manage.py migrate操作。 由于前后的makemigrations的文件不一致,导致数据库中的字段与Django…

    Django 2023年4月13日
    00
  • Apache ab并发负载压力测试(python+django+mysql+apache)

    如标题,大家都知道秒杀中存在高并发使库存骤然为0,但在我们个人PC或小区域内是模拟不出这样的情景 现在利用 Apache ab并发负载压力测试  1,数据库建入库存字段并映射模型 2,view编写脚本 #秒杀压力测试 def miaosha(request): res_one = Newss.objects.get(pk=1) if res_one.pd &…

    Django 2023年4月13日
    00
  • day16- django

    MVC和MTV模式 Django的MTV模式本质是各组件之间为了保持松耦合关系,Django的MTV分别代表:        Model(模型):负责业务对象与数据库的对象(ORM)        Template(模版):负责如何把页面展示给用户        View(视图):负责业务逻辑,并在适当的时候调用Model和Template        此…

    2023年4月9日
    00
  • 为django项目配置celery的后台启动

    为root用户启动celery创建的脚本,该脚本的拥有者与使用者都必须是root .使用方法为 /etc/init.d/celeryd [start]|[stop]|[kill]需增加两个文件 /etc/default/celeryd(配置脚本) 和 /etc/init.d/celeryd (启动脚本)1.编辑 /etc/default/celeryd : …

    Django 2023年4月9日
    00
  • django 修改后台的名称及应用名称

    后台顶部标题的修改app/admin.py中设置 admin.site.site_title = “智能对话机器人后台管理” admin.site.site_header = “机器人后台管理 smart AI” 应用的名称修改 第一步:修改apps.py文件在name所在行下方增加 verbose_name=u”应用名称”    第二步:修改__init_…

    Django 2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部