Владислав Меленчук
Владислав МеленчукМамыр 26, 2020, 9: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, 9:39 Т.Ж.

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

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

    Владислав Меленчук
    • Мамыр 26, 2020, 9:48 Т.Ж.

    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]
      
        Владислав Меленчук
        • Мамыр 26, 2020, 10:06 Т.Ж.

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

          Evgenii Legotckoi
          • Мамыр 26, 2020, 12:27 Т.Қ.

          Думаю, что в твоём случае так сработает {{ 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 %}
              
                Evgenii Legotckoi
                • Мамыр 27, 2020, 1:24 Т.Ж.

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

                  Пікірлер

                  Тек рұқсаты бар пайдаланушылар ғана пікір қалдыра алады.
                  Кіріңіз немесе Тіркеліңіз
                  Г

                  C++ - Тест 001. Первая программа и типы данных

                  • Нәтиже:66ұпай,
                  • Бағалау ұпайлары-1
                  t

                  C++ - Тест 001. Первая программа и типы данных

                  • Нәтиже:33ұпай,
                  • Бағалау ұпайлары-10
                  t

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

                  • Нәтиже:52ұпай,
                  • Бағалау ұпайлары-4
                  Соңғы пікірлер
                  G
                  GoattRockҚыр. 3, 2024, 1:50 Т.Қ.
                  Linux жүйесінде файлдарды қалай көшіруге болады Задумывались когда-нибудь о том, как мы привыкли доверять свои вещи службам грузоперевозок? Сейчас такие услуги стали неотъемлемой частью нашей жизни, особенно когда речь идет о переездах между …
                  d
                  dblas5Шілде 5, 2024, 11:02 Т.Ж.
                  QML - Сабақ 016. SQLite деректер қоры және онымен QML Qt-та жұмыс істеу Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                  k
                  kmssrАқп. 8, 2024, 6:43 Т.Қ.
                  Qt Linux - Сабақ 001. Linux астында Autorun Qt қолданбасы как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                  АК
                  Анатолий КононенкоАқп. 5, 2024, 1:50 Т.Ж.
                  Qt WinAPI - Сабақ 007. Qt ішінде ICMP Ping арқылы жұмыс істеу Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                  Енді форумда талқылаңыз
                  Evgenii Legotckoi
                  Evgenii LegotckoiМаусым 24, 2024, 3:11 Т.Қ.
                  добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                  F
                  FynjyШілде 22, 2024, 4:15 Т.Ж.
                  при создании qml проекта Kits есть но недоступны для выбора Поставил Qt Creator 11.0.2. Qt 6.4.3 При создании проекта Qml не могу выбрать Kits, они все недоступны, хотя настроены и при создании обычного Qt Widget приложения их можно выбрать. В чем может …
                  BlinCT
                  BlinCTМаусым 25, 2024, 1 Т.Ж.
                  Нарисовать кривую в qml Всем привет. Имеется Лист листов с тосками, точки получаны интерполяцией Лагранжа. Вопрос, как этими точками нарисовать кривую? ChartView отпадает сразу, в qt6.7 появился новый элемент…
                  BlinCT
                  BlinCTМамыр 5, 2024, 5:46 Т.Ж.
                  Написать свой GraphsView Всем привет. В Qt есть давольно старый обьект дял работы с графиками ChartsView и есть в 6.7 новый но очень сырой и со слабым функционалом GraphsView. По этой причине я хочу написать х…
                  Evgenii Legotckoi
                  Evgenii LegotckoiМамыр 2, 2024, 2:07 Т.Қ.
                  Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.

                  Бізді әлеуметтік желілерде бақылаңыз