Владислав Меленчук
Владислав Меленчук26 мая 2020 г. 19:26

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 г. 19: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 г. 19: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 г. 22: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.

                  Комментарии

                  Только авторизованные пользователи могут публиковать комментарии.
                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                  Ua

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:84баллов,
                  • Очки рейтинга4
                  Ua

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:42баллов,
                  • Очки рейтинга-8
                  ОК

                  Qt - Тест 001. Сигналы и слоты

                  • Результат:47баллов,
                  • Очки рейтинга-6
                  Последние комментарии
                  ИМ
                  Игорь Максимов22 ноября 2024 г. 21:51
                  Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                  Evgenii Legotckoi
                  Evgenii Legotckoi31 октября 2024 г. 23:37
                  Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                  A
                  ALO1ZE19 октября 2024 г. 17:19
                  Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                  ИМ
                  Игорь Максимов5 октября 2024 г. 16:51
                  Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                  d
                  dblas55 июля 2024 г. 20:02
                  QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  Сейчас обсуждают на форуме
                  f
                  firstlunoxod15 февраля 2025 г. 13:46
                  Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                  Дмитрий
                  Дмитрий3 февраля 2025 г. 16:24
                  Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                  NW
                  Nayo Wai30 января 2025 г. 19:22
                  не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                  n
                  nkly3 января 2025 г. 12:52
                  Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                  M
                  Marsel17 августа 2023 г. 0:26
                  OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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