Я хотел бы отображать только один пост в 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 решает эту проблему.