1

Django-sites フレームワークを使用して、異なるサイト間でオブジェクトを共有しています。モデル内で多対多の関係を定義できたため、これはうまく機能します。

ただし、テンプレート タグ 'render_comment_list' を使用してオブジェクトのコメント (Django コメント) を取得しているときに、その特定のサイトに投稿されたコメントのみを取得します。これは当然のことですが、複数のサイトで共有されているそのオブジェクトについて投稿された他のコメントも取得したいと思います。

Django-comments のコードを掘り下げると、これが「問題」の原因となっている方法のようです。

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' が特定のサイトのコメントだけでなく、オブジェクトのすべてのコメントを表示するように動作を変更する最も簡単な方法は何でしょうか?
  • 別のテンプレート タグを作成し、Django-comments テンプレート タグ コードの 99% をコピーして貼り付ける必要がありますか?

ありがとう

4

2 に答える 2

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)
于 2011-12-18T23:35:36.787 に答える
0

ありがとうアラスデア!変更を加えましたが、動作しています。わかりやすくするために、コード全体を記述します (これで動作します!):

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)
于 2011-12-20T23:36:18.600 に答える