Я хотел бы отображать только один пост в fronted (dajngo framework)

Я разместил несколько сообщений, но не могу отобразить только одно сообщение на передней панели из нескольких сообщений. вместо этого отображаются все сообщения, что неправильно. помощь приветствуется, спасибо

views.py

def ann(request):
    ann = Announcement.objects.all()
    context = {
        'ann': ann
    }
    return render(request, 'Announcement.html', context)

index.html

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Community</title>
    <!-- Bootstrap -->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/css/bootstrap.min.css"
        integrity="sha384-B0vP5xmATw1+K9KRQjQERJvTumQW0nPEzvF6L/Z6nronJ3oUOFUFpCjEUQouq2+l" crossorigin="anonymous">
    <!-- Font Awesome -->
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.11.2/css/all.css" />
    <link rel="stylesheet" href="{% static 'css/bootstrap@5.1.3.css' %}">

    <!-- Style.css -->
    <link rel="stylesheet" href="{% static 'css/style.css' %}">

</head>

<body>
  {% block content %}
  {% include 'navbar.html' %}
 {% for ann in ann %}
 {% if forloop.first %}
    <div class="col-12 col-lg-10 col-xl-10 col-sm-10" style="margin: auto;">
      <div class="row">
            <div class="card-body">
              <h4 class="card-title" style="text-align: right; border-bottom: 2px solid; color:  #46a271; padding: 17px; overflow: hidden;
              top: 0;
              z-index: -1000;
              
              ">
              <p style="color: #0e3d42;">Category: {{ann.name}}</p>  </h4>
              <br>
              <p class="card-text" style="text-align: center;">{{ann.body|safe}}</p>
              <p> Post created on {{ann.created_date}}</p>
            </div>
        </div>
  </div>
  {% endif %}
  {% endfor %}
    <br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br>
{% include 'footer.html' %}
    {% endblock %}


  <!-- Scripts -->
  <script src="{% static 'jquery/jquery-3.5.1.slim.min.js' %}"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.0/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-Piv4xVNRyMGpqkS2by6br4gNJ7DXjqk09RmUpJ8jgGtD7zP9yug3goQfGII0yAns"
      crossorigin="anonymous"></script>
  <!-- Custom Script -->
  <!-- <script>
      function truncateText(selector, maxLength) {
          var element = document.querySelector(selector);
              let truncated = element.innerText;

          if (truncated.length > maxLength) {
              truncated = truncated.substr(0, maxLength) + '...';
          }

          console.log(truncated)
          return truncated;
      }

      document.querySelector('.body-text').innerText = truncateText('.body-text', 140);
  </script> -->
  <script src="{% static 'js/script.js' %}"></script>
  <script src="{% static 'js/bootstrap.bundle.min.js' %}"></script>
</body>

</html>
  • Примечание: Невозможно отобразить только одну страницу в файле announcement.html, как указано выше, а также использовать фильтр, мне нужно отобразить все сообщения, когда я нажимаю на кнопку Читать дальше
  • .

Ваше представление использует queryset, который возвращает все объекты объявлений, а затем ваш шаблон перебирает все эти объявления. Я вижу, что вы пытаетесь использовать оператор 'if' в вашем шаблоне, который ловит только одну итерацию этого цикла, но вообще говоря, наличие такого типа логики в слое шаблона можно считать плохой практикой.

В зависимости от того, какое объявление вы хотите вернуть, сначала вам нужно изменить эту часть вашего представления:

ann = Announcement.objects.all()

Вы можете ограничить набор запросов различными способами, например:

Announcement.objects.order_by('some_date_column')[0]

... получит самое старое объявление, однако я предполагаю, что вы, вероятно, хотите динамически возвращать разные объявления на основе чего-то вроде первичного ключа или slug.

Добавьте маршрут url по следующей схеме ("pk" - первичный ключ объявления, которое вы хотите получить):

urlpatterns = [

path("annoucements/<int:pk>/", ann, name="annoucement_detail"),

 ] 
def ann(request, pk):
    ann = Announcement.objects.filter(id=pk)
    context = {
        'ann': ann
    }
    return render(request, 'Announcement.html', context)

или даже лучше

def announcement_detail(request, pk):
     annoucement = get_object_or_404(Announcement, id=pk)
     context = {
        'annoucement': annoucement 
        }
    return render(request, 'Announcement.html', context)

Тогда вы можете просто удалить логику цикла в своем шаблоне. Теперь вы передаете один объект в контекст, а не извлекаете все объекты Announcement из БД и отфильтровываете их в шаблоне.

Другой подход заключается в использовании представлений Django, основанных на общих классах. Представление Detail View решает эту проблему.

Вернуться на верх