Извлечение Django-комментариев со всех сайтов для данного объекта - PullRequest
1 голос
/ 19 декабря 2011

Я делюсь объектами между различными сайтами, используя инфраструктуру Django-sites. Это прекрасно работает, потому что я смог определить отношение многие ко многим в моих моделях.

Однако, при получении комментариев (Django-comments) для объектов с помощью тега шаблона 'render_comment_list', я получаю только те комментарии, которые были размещены на этом конкретном сайте. Это ожидается, но я хотел бы также получить другие комментарии, которые были опубликованы для этого объекта, который используется несколькими сайтами.

Копаясь в коде 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-comments?

Спасибо

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Вам не нужно копировать и пропускать 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 голосов
/ 21 декабря 2011

Спасибо, 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)
...