2011-12-18 38 views
1

我使用Django站点框架在不同站点之间共享对象。这很好,因为我能够在我的模型中定义多对多关系。从给定对象的所有站点获取Django评论

然而,当检索使用模板标签“render_comment_list”的对象的意见(Django的评论),我只得到它在那里张贴在特定网站的评论。这是预期的,但我也希望获得那些在多个站点之间共享的对象的其他评论。

挖掘到的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评论模板标签代码?

感谢

回答

1

您不必复制模板标记代码的过去的99%,只要继承RenderCommentListNode和覆盖,你发现了问题的get_queryset_method。然后复制render_comment_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) 
0

Thanks Alasdair!我做了改变,它正在工作。为了清晰起见,编写了整个代码(现在有效!):

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)