Django get_comment_list没有返回评论

时间:2014-03-07 22:23:14

标签: python django sqlite django-comments

我正在使用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数据库浏览器中浏览数据库数据我可以在那里找到:

SQLite Database Browser

那么,为什么我不能得到评论列表?有什么我想念的吗?这是模板:

{% 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 %}传递给此模板。

3 个答案:

答案 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所述。

表单的最终形式,以及自定义模型中添加的字段upvotesdownvotes如下所示:

# -*- 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')

所以,如果有人也遇到同样的问题,请尝试检查一下,我希望也是你的解决方案;)