我正在使用Django的评论框架来管理我网站上的评论。我有自定义注释模型和扩展Django的表单,如下所示:
型号:
class FTComment(Comment):
upvotes = models.PositiveSmallIntegerField()
downvotes = models.PositiveSmallIntegerField()
形式:
class FTCommentForm(CommentForm):
captcha = ReCaptchaField(required=True)
def get_comment_create_data(self):
# Use the data of the superclass, and remove extra fields
return dict(
content_type = ContentType.objects.get_for_model(self.target_object),
object_pk = force_unicode(self.target_object._get_pk_val()),
comment = self.cleaned_data["comment"],
submit_date = datetime.datetime.now(),
site_id = settings.SITE_ID,
is_public = True,
is_removed = False,
)
FTCommentForm.base_fields.pop('url')
FTCommentForm.base_fields.pop('email')
FTCommentForm.base_fields.pop('name')
评论表格工作正常,在SQLite数据库浏览器中浏览数据库数据我可以在那里找到:
那么,为什么我不能得到评论列表?有什么我想念的吗?这是模板:
{% load i18n %}
{% load comments %}
<link rel="stylesheet" type="text/css" href="/static/css/comment.css" />
<p>
<strong>{% trans "Comments" %}</strong>
</p>
<div class="comment_box">
{% if user.is_authenticated %}
{% render_comment_form for obj %}
{% else %}
<p>Please <a href="/login">log in</a> to leave a comment.</p>
{% endif %}
{% get_comment_count for obj as count %}
<p>Count: {{ count }}</p>
{% get_comment_list for obj as comments %}
{% for comment in comments %}
{{ comment.comment }}
{% endfor %}
</div>
count
返回0,尽管数据库中有2个对此对象的注释,for
循环没有呈现任何内容。
对此的帮助将非常感激。
修改:添加了视图
以下是本案的观点:
def show_detail(request, img_id):
img = get_object_or_404(Image, pk=img_id)
img.views += 1
img.save()
try:
referer = Referer()
referer.referer_url = request.META['HTTP_REFERER']
referer.object = img
referer.save()
except KeyError:
pass
return render(request, "img/show_detail.html", {'img': img})
编辑2:
对不起,我应该解释一下。呈现注释的模板位于不同的文件中,因此可供其他页面/模板使用。对象的引用如下所示:{% include "comment/main.html" with obj=img %}
传递给此模板。
答案 0 :(得分:0)
您在obj
中引用的{% get_comment_list for obj as comments %}
似乎不在您的模板上下文中。
如果您的评论在图片模型上,那么您应该将模板代码中对obj
的所有引用更改为img
,因为这是您在模板上下文中提供的关键字(来自return render(request, "img/show_detail.html", {'img': img})
)。
答案 1 :(得分:0)
您需要在模板中加入comments template tag {% load_comments %}
。然后,您可以访问评论上下文。
答案 2 :(得分:0)
我设法让它发挥作用!
问题是我的自定义表单没有引用我的自定义模型,但是Django的库存模型,AND,标记get_comment_list
以及get_comment_count
引用了我的自定义模型,如我所定义的评论应用__init__.py
:
def get_model():
return FTComment
def get_form():
return FTCommentForm
因此,表单将注释保存为Django注释对象,但模板标记尝试以获取我的自定义注释对象,该对象在数据库中为空。
解决方案是在自定义表单中定义get_comment_model
方法,如in the Django's documentation所述。
表单的最终形式,以及自定义模型中添加的字段upvotes
和downvotes
如下所示:
# -*- coding: utf-8 -*-
from captcha.fields import ReCaptchaField
import datetime
from django.conf import settings
from django.contrib.comments.forms import CommentForm
from django.contrib.contenttypes.models import ContentType
from django.utils.encoding import force_unicode
from fingertools.comment.models import FTComment
class FTCommentForm(CommentForm):
captcha = ReCaptchaField(required=True)
def get_comment_model(self):
return FTComment
def get_comment_create_data(self):
# Use the data of the superclass, and remove extra fields
return dict(
content_type = ContentType.objects.get_for_model(self.target_object),
object_pk = force_unicode(self.target_object._get_pk_val()),
comment = self.cleaned_data["comment"],
submit_date = datetime.datetime.now(),
site_id = settings.SITE_ID,
is_public = True,
is_removed = False,
upvotes = 0,
downvotes = 0,
)
FTCommentForm.base_fields.pop('url')
FTCommentForm.base_fields.pop('email')
FTCommentForm.base_fields.pop('name')
所以,如果有人也遇到同样的问题,请尝试检查一下,我希望也是你的解决方案;)