Templatetags из GenericForeign

Django

Всем привет, не подскажете как сделать templatetags на вывод последних комментариев в сайдбаре для постов? Именно для постов.

@register.simple_tag()
def get_last_comments():
    return Comment.objects.all()

Пробовал из Post.comments.all
Выводит:

'ReverseGenericManyToOneDescriptor' object has no attribute 'all'

Сам шаблон:

{% load core_tags %}

{% get_last_comments as comments %}
{% for comment in comments %}
<div class="card-body pt-1 p-0">
   <!-- Header -->
   <div class="mb-3">
      <div class="row align-items-center">
         <div class="col-auto">
            <!-- Avatar -->
            <div class="avatar avatar-sm">
               <img src="{% if comment.user.avatar %}{{ comment.user.avatar.url }}{% else %}/static/templates/images/noavatar.png{% endif %}" alt="Аватар" class="avatar-img rounded-circle">
            </div>
         </div>
         <div class="col ml-n3">
            <!-- Title -->
            <h6 class="mb-1 small font-weight-bold">
               {{ comment.user }}
               <button role="button" class="btn ml-1 btn-xs btn-white">{{ comment.user.first_name }}</button>
            </h6>
            <!-- Time -->
            <p class="card-text small text-muted">
               <span class="far fa-clock"></span> <time>{{ comment.pub_date }}</time>
            </p>
         </div>
      </div>
   </div>
   <!-- Text -->
   <div class="mb-3 comment-body-last p-2 card-text">
      {{ comment.text|safe|truncatechars:200 }}
   </div>
   <a href="{{ comment.post.get_absolute_url }}" class="small text-muted"><span class="fa fa-arrow-right"></span> {{ comment.post.title }} </a>
</div>
<hr>
{% endfor %}
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

8
Evgenii Legotckoi
  • 26 мая 2020 г. 9:39

Как-то та должен выглядеть запрос к базе данных для GenericForeignKey

@register.simple_tag()
def get_last_comments():
    return Comment.objects.all(content_type=ContentType.objects.get_for_model(Post))[:5]

    all() got an unexpected keyword argument 'content_type'

      Evgenii Legotckoi
      • 26 мая 2020 г. 9:59
      • Ответ был помечен как решение.

      Конечно же filter

      @register.simple_tag()
      def get_last_comments():
          return Comment.objects.filter(content_type=ContentType.objects.get_for_model(Post))[:5]
      

        Хм, ещё одна загвостка, а как мне вывести в шаблоне последних комментариев ссылку на пост этого комментария и название самого поста? Ранее писал {{ comment.post.title }}

          Думаю, что в твоём случае так сработает {{ comment.content_object.title }}, если по джанговской документации всё делал.

            О да, сработало! Отлично! Сейчас мучаюсь с фильтрацией ответов на коммент. Думаю как сделать. Раньше делал для простых комментов по related_name:

            models.py for Post
            # Вложенность
                def get_comments_article(self):
                    return self.comments_article.filter(parent__isnull=True)
            

            Как сейчас быть не знаешь?

              Владислав Меленчук
              • 26 мая 2020 г. 12:40
              • (ред.)

              Сделал так:

                  def get_comments(self):
                      return self.comments.filter(parent__isnull=True)
              

              В шаблоне пропали комменты с parent. Щас буду выводить parent комменты. Ещё бы было бы сохранение какого-нибудь сдвига, как у тебя в гайде по комментам. Но хз как к себе прикрутить, тоже на pg сижу.

              Прикрутил в шаблоне:

                  {% for child_comment in comment.comment_set.all %}
                      {{ child_comment.text }}
                      {% endfor %}
              

                Ну сохранение сдвига лучше всё-таки делать через materialized path, как и в статье сделано, тогда можно одним запросом выбирать все комментарии.
                Там же просто последовательно сохраняются все id парент комментариев в цепочке.
                Но если честно, мне не особо нравится такой подход. Пространство недостаточно эффективно используется в данном случае.
                Главное в комментарии ещё делать внешний ключ на саму модель комментариев. У меня это поле answer_to.

                  Комментарии

                  Только авторизованные пользователи могут публиковать комментарии.
                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                  г
                  • ги
                  • 23 апреля 2024 г. 15:51

                  C++ - Тест 005. Структуры и Классы

                  • Результат:41баллов,
                  • Очки рейтинга-8
                  l
                  • laei
                  • 23 апреля 2024 г. 9:19

                  C++ - Тест 004. Указатели, Массивы и Циклы

                  • Результат:10баллов,
                  • Очки рейтинга-10
                  l
                  • laei
                  • 23 апреля 2024 г. 9:17

                  C++ - Тест 003. Условия и циклы

                  • Результат:50баллов,
                  • Очки рейтинга-4
                  Последние комментарии
                  k
                  kmssr8 февраля 2024 г. 18:43
                  Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  АК
                  Анатолий Кононенко5 февраля 2024 г. 1:50
                  Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  EVA
                  EVA25 декабря 2023 г. 10:30
                  Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                  J
                  JonnyJo25 декабря 2023 г. 8:38
                  Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                  G
                  Gvozdik18 декабря 2023 г. 21:01
                  Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                  Сейчас обсуждают на форуме
                  G
                  Gar22 апреля 2024 г. 5:46
                  Clipboard Как скопировать окно целиком в clipb?
                  DA
                  Dr Gangil Academics20 апреля 2024 г. 7:45
                  Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                  a
                  a_vlasov14 апреля 2024 г. 6:41
                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                  Павел Дорофеев
                  Павел Дорофеев14 апреля 2024 г. 2:35
                  QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                  f
                  fastrex4 апреля 2024 г. 4:47
                  Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…

                  Следите за нами в социальных сетях