【问题标题】:I would like to display only one post at fronted (dajngo framework)我想在前端只显示一篇文章(django 框架)
【发布时间】:2021-12-26 19:51:11
【问题描述】:

我已经发布了几篇文章,但无法在几篇文章的前端仅显示一篇文章。相反,它会显示所有不正确的帖子。感谢您的帮助,谢谢

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文件中不能只显示一页并且还使用了过滤器,我需要在点击阅读更多按钮时显示所有帖子

【问题讨论】:

    标签: django django-models django-views django-forms django-templates


    【解决方案1】:

    您的视图正在使用一个查询集,该查询集返回您的所有公告对象,然后您的模板循环遍历所有这些公告。我可以看到您正在尝试在模板中使用“if”语句,该语句仅捕获此循环的一次迭代,但一般来说,在模板层中使用这种类型的逻辑可能被认为是不好的做法。

    根据您希望返回的公告,首先您需要修改这部分视图:

    ann = Announcement.objects.all()
    

    您可以通过各种不同的方式limit a queryset,例如:

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

    ...将获得最旧的公告,但我猜您可能希望根据主键或 slug 等内容动态返回不同的单个公告。

    沿此添加url route,('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 解决了这个问题。

    【讨论】:

      最近更新 更多