Templatetags из GenericForeign

Django

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

  1. @register.simple_tag()
  2. def get_last_comments():
  3. return Comment.objects.all()
  4.  

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

  1. 'ReverseGenericManyToOneDescriptor' object has no attribute 'all'
  2.  

Сам шаблон:

  1. {% load core_tags %}
  2.  
  3. {% get_last_comments as comments %}
  4. {% for comment in comments %}
  5. <div class="card-body pt-1 p-0">
  6. <!-- Header -->
  7. <div class="mb-3">
  8. <div class="row align-items-center">
  9. <div class="col-auto">
  10. <!-- Avatar -->
  11. <div class="avatar avatar-sm">
  12. <img src="{% if comment.user.avatar %}{{ comment.user.avatar.url }}{% else %}/static/templates/images/noavatar.png{% endif %}" alt="Аватар" class="avatar-img rounded-circle">
  13. </div>
  14. </div>
  15. <div class="col ml-n3">
  16. <!-- Title -->
  17. <h6 class="mb-1 small font-weight-bold">
  18. {{ comment.user }}
  19. <button role="button" class="btn ml-1 btn-xs btn-white">{{ comment.user.first_name }}</button>
  20. </h6>
  21. <!-- Time -->
  22. <p class="card-text small text-muted">
  23. <span class="far fa-clock"></span> <time>{{ comment.pub_date }}</time>
  24. </p>
  25. </div>
  26. </div>
  27. </div>
  28. <!-- Text -->
  29. <div class="mb-3 comment-body-last p-2 card-text">
  30. {{ comment.text|safe|truncatechars:200 }}
  31. </div>
  32. <a href="{{ comment.post.get_absolute_url }}" class="small text-muted"><span class="fa fa-arrow-right"></span> {{ comment.post.title }} </a>
  33. </div>
  34. <hr>
  35. {% endfor %}
2

Do you like it? Share on social networks!

8
Evgenii Legotckoi
  • May 26, 2020, 7:39 p.m.

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

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

    all() got an unexpected keyword argument 'content_type'

      Evgenii Legotckoi
      • May 26, 2020, 7:59 p.m.
      • The answer was marked as a solution.

      Конечно же filter

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

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

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

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

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

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

              Владислав Меленчук
              • May 26, 2020, 10:40 p.m.
              • (edited)

              Сделал так:

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

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

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

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

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

                  Comments

                  Only authorized users can post comments.
                  Please, Log in or Sign up
                  • Last comments
                  • AK
                    April 1, 2025, 11:41 a.m.
                    Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
                  • Evgenii Legotckoi
                    March 9, 2025, 9:02 p.m.
                    К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
                  • VP
                    March 9, 2025, 4:14 p.m.
                    Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
                  • ИМ
                    Nov. 22, 2024, 9:51 p.m.
                    Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  • Evgenii Legotckoi
                    Oct. 31, 2024, 11:37 p.m.
                    Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup