完整攻略:基于Django contrib Comments 评论模块(详解)
- 安装Django contrib
首先,在你的Django项目中安装Django contrib:
pip install django-contrib-comments
- 添加评论到你的模型中
在你的模型中,你需要导入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')
- 将评论标签添加到你的模板中
在你想要显示评论的模板中,你需要在<html>
标记中导入评论模板标签,例如:
{% load comments %}
之后在你希望出现评论的地方添加以下标签:
{% load comments %}
...
{% render_comment_list for mymodel %}
其中mymodel
是你要渲染评论的模型的名字。
- 允许用户发表评论
要让用户在你的网站上发表评论,你需要在你的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
对象。最后,我们将用户重定向到评论后的页面。如果有错误或请求数据无效,我们需要将错误显示给用户。
- 实现用户审核评论
从安全角度考虑,你可能希望在您的网站发布评论之前,对评论内容进行审核。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
是你想要显示评论的模型的实例。
示例二:创建评论
如果你想让用户在你的网站上创建评论,你需要做以下几个步骤:
- 创建一个模版,其中包含一个表单用于创建评论,例如:
<form method="POST" action="{% url 'mymodel_detail' mymodel.pk %}">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Submit</button>
</form>
- 写一个视图用于处理表单数据,并将它添加到你的模型的详情页面中,例如:
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技术站