基于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项目部署流程与Nginx安装配置

    安装Nginx 在Ubuntu系统中,可以通过以下命令安装Nginx: sudo apt-get update sudo apt-get install nginx 配置静态文件访问 在Django项目的settings.py文件中,加入以下代码: STATIC_URL = '/static/' STATIC_ROOT = os.path…

    Django 2023年3月13日
    00
  • 详解Django模板系统

    Django模板系统是Django框架的一部分,被用于生成HTML页面,并支持动态生成内容。Django模板系统提供了许多内置标签和过滤器,以便于开发者对页面进行更方便的操作和控制。下面我们来了解一下Django模板系统的详细。 显示变量 在Django模板系统中,通过{{}}来显示变量。 如下所示: <h1>Hello, {{ name }}&…

    Django 2023年3月13日
    00
  • django基础知识之模型查询:

    查询集表示从数据库中获取的对象集合 查询集可以含有零个、一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤…

    Django 2023年4月13日
    00
  • Django基于Models定制Admin后台实现过程解析

    下面我将详细讲解 “Django基于Models定制Admin后台实现过程解析”的完整攻略。在实现过程中,我们将使用两个示例来说明。 1. 简介 Django是一款使用Python语言编写的开源Web框架,其主要目的是快速开发可维护的Web应用程序。Django提供了一组工具和库,使得开发Web应用程序变得简单和高效。其中之一就是Django Admin,它…

    Django 2023年5月16日
    00
  • nginx + uWSGI 提高 Django的并发性

    1. uWSGI : uWSGI是一个web服务器,实现了WSGI协议、uwsgi协议、http协议等。 uWSGI的主要特点是: 超快的性能 低内存占用 多app管理 详尽的日志功能(可以用来分析app的性能和瓶颈) 高度可定制(内存大小限制,服务一定次数后重启等) uWSGI服务器自己实现了基于uwsgi协议的server部分,我们只需要在uwsgi的配…

    Django 2023年4月10日
    00
  • 第十四篇Django-model进阶(中介模型,查询优化,extra,整体插入)

    阅读目录(Content) 中介模型 查询优化 extra 整体插入 中介模型 但是,有时你可能需要关联数据到两个模型之间的关系上。 但是,有时你可能想知道更多成员关系的细节,比如成员是何时加入小组的。 对于上面的音乐小组的例子,代码如下: from django.db import models class Person(models.Model): na…

    Django 2023年4月16日
    00
  • vue+django实现下载文件的示例

    当你在使用Vue.js 和 Django开发网站时,你经常会遇到需要用户下载文件的情况。下面是两个可以帮助你实现这个功能的示例: 示例一:Vue + Django 实现下载文件 Vue 部分 假设你在 Vue.js 2.x 中,首先你需要一个下载接口在 Vue 组件中: downloadFile() { const url = ‘http://example…

    Django 2023年5月16日
    00
  • Django-URL路由配置

    目录 一、URL配置 参数说明 二 、正则表达式详解 注意事项 捕获的参数永远都是字符串: 三、include其他的URLconfs(也叫URL分发) 四、传递额外的参数给视图函数 五、命名URL(别名)和URL的反向解析 六、命名空间模式 一、URL配置   URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用…

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