Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从给定对象的所有站点获取Django注释_Django_Django Comments_Django Sites - Fatal编程技术网

从给定对象的所有站点获取Django注释

从给定对象的所有站点获取Django注释,django,django-comments,django-sites,Django,Django Comments,Django Sites,我使用Django站点框架在不同站点之间共享对象。这很好,因为我能够在模型中定义多对多关系 但是,在使用模板标记“render_comment_list”检索对象的注释(Django comments)时,我只得到那些发布在特定站点中的注释。这是意料之中的,但我也希望得到那些其他的评论,这些评论是针对多个站点共享的对象发布的 深入研究Django注释的代码,似乎这就是导致“问题”的方法: def get_query_set(self, context): ctype, object_pk

我使用Django站点框架在不同站点之间共享对象。这很好,因为我能够在模型中定义多对多关系

但是,在使用模板标记“render_comment_list”检索对象的注释(Django comments)时,我只得到那些发布在特定站点中的注释。这是意料之中的,但我也希望得到那些其他的评论,这些评论是针对多个站点共享的对象发布的

深入研究Django注释的代码,似乎这就是导致“问题”的方法:

def get_query_set(self, context):
    ctype, object_pk = self.get_target_ctype_pk(context)
    if not object_pk:
        return self.comment_model.objects.none()

    qs = self.comment_model.objects.filter(
        content_type = ctype,
        object_pk    = smart_unicode(object_pk),
        site__pk     = settings.SITE_ID,
    )
我的问题是:

  • 更改行为的最简单方法是什么,以便模板标记“render_comment_list”显示对象的所有注释,而不仅仅是特定站点的注释
  • 我是否需要创建另一个模板标记并复制粘贴99%的Django注释模板标记代码

谢谢

您不必复制并超过99%的模板标记代码,只需将
RenderCommentListNode
子类化,并覆盖发现问题的
get\u queryset\u方法
。然后复制
render\u comment\u list
函数,但使用子类

class RenderCommentListNodeAllSites(RenderCommnetListNode):
    def get_query_set(self, context):
        ctype, object_pk = self.get_target_ctype_pk(context)
        if not object_pk:
            return self.comment_model.objects.none()

        qs = self.comment_model.objects.filter(
            content_type = ctype,
            object_pk    = smart_unicode(object_pk),
        )

def render_comment_list_all_sites(parser, token):
    return RenderCommentListNodeAllSites.handle_token(parser, token)
register.tag(render_comment_list_all_sites)

您不必复制并超过模板标记代码的99%,只需子类
RenderCommentListNode
并覆盖
get\u queryset\u方法
。然后复制
render\u comment\u list
函数,但使用子类

class RenderCommentListNodeAllSites(RenderCommnetListNode):
    def get_query_set(self, context):
        ctype, object_pk = self.get_target_ctype_pk(context)
        if not object_pk:
            return self.comment_model.objects.none()

        qs = self.comment_model.objects.filter(
            content_type = ctype,
            object_pk    = smart_unicode(object_pk),
        )

def render_comment_list_all_sites(parser, token):
    return RenderCommentListNodeAllSites.handle_token(parser, token)
register.tag(render_comment_list_all_sites)

谢谢阿拉斯代尔!我做了改变,它正在工作。为清晰起见,编写整个代码(现在可以了!):

class RenderCommentListNodeAllSites(RenderCommentListNode):
    def get_query_set(self, context):
        ctype, object_pk = self.get_target_ctype_pk(context)
        if not object_pk:
            return self.comment_model.objects.none()

        qs = self.comment_model.objects.filter(
            content_type = ctype,
            object_pk    = smart_unicode(object_pk),
            #site__pk     = settings.SITE_ID,
        )

        # The is_public and is_removed fields are implementation details of the
        # built-in comment model's spam filtering system, so they might not
        # be present on a custom comment model subclass. If they exist, we
        # should filter on them.
        field_names = [f.name for f in self.comment_model._meta.fields]
        if 'is_public' in field_names:
            qs = qs.filter(is_public=True)
        if getattr(settings, 'COMMENTS_HIDE_REMOVED', True) and 'is_removed' in field_names:
            qs = qs.filter(is_removed=False)

        return qs

def render_comment_list_all_sites(parser, token):
    return RenderCommentListNodeAllSites.handle_token(parser, token)
register.tag(render_comment_list_all_sites)

谢谢阿拉斯代尔!我做了改变,它正在工作。为清晰起见,编写整个代码(现在可以了!):

class RenderCommentListNodeAllSites(RenderCommentListNode):
    def get_query_set(self, context):
        ctype, object_pk = self.get_target_ctype_pk(context)
        if not object_pk:
            return self.comment_model.objects.none()

        qs = self.comment_model.objects.filter(
            content_type = ctype,
            object_pk    = smart_unicode(object_pk),
            #site__pk     = settings.SITE_ID,
        )

        # The is_public and is_removed fields are implementation details of the
        # built-in comment model's spam filtering system, so they might not
        # be present on a custom comment model subclass. If they exist, we
        # should filter on them.
        field_names = [f.name for f in self.comment_model._meta.fields]
        if 'is_public' in field_names:
            qs = qs.filter(is_public=True)
        if getattr(settings, 'COMMENTS_HIDE_REMOVED', True) and 'is_removed' in field_names:
            qs = qs.filter(is_removed=False)

        return qs

def render_comment_list_all_sites(parser, token):
    return RenderCommentListNodeAllSites.handle_token(parser, token)
register.tag(render_comment_list_all_sites)