2011-12-18 66 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)