如何将分页添加到第三个 Django 代码?

How do I add paginator to thid django code?

我有一个系统,用户可以在其中查看他们在一个页面上注册的投诉。但问题是页面上一次只能看到四个投诉。如何在代码中添加 pageinator,以便可以在其他页面上以正确的格式和模板查看接下来的四个投诉:

views.py:

def History(request):
  complaint_data = Complaint.objects.filter(user=request.user) 
  context = { 'complaint':complaint_data }
  return render(request, 'myHistory.html', context)

模板:

<!-- Middle Container -->
    <div class="col-lg middle middle-complaint-con">
        <i class="fas fa-folder-open fa-4x comp-folder-icon"></i>
        <h1 class="all-comp">My Complaints</h1>
        <p class="all-comp-txt">Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>

        {%for c in complaint %}
        <a href="{% url 'Complaint' c.pk %}" style="color:black;">
            <div class="container comp-con-{{forloop.counter0}}">
                <p style="color: #D37A19; margin-left: -130px; margin-top: -5px;">Report number:</p>
                <p class="history-level-1">{{c.reportnumber}}</p>
                <p class="comp-title-1">{{c.event_type}}</p>
                <p class="comp-sub-1">{{c.event_text|truncatechars:85}}</p>
            </div>
        </a> {%endfor%}
    </div>

css:

enter code h.comp-con-0 {
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        align-items: center;
        padding: 11px 8px;
        position: absolute;
        width: 300px;
        height: 140px;
        left: 160px;
        top: 190px;
        background: #FFEEDB;
        box-shadow: 1px 1px 2px rgb(0 0 0 / 25%);
        border-radius: 10px;
    }
    
    .comp-con-1 {
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        align-items: center;
        padding: 10px;
        position: absolute;
        width: 300px;
        height: 140px;
        left: 160px;
        top: 400px;
        background: #FFEEDB;
        box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
        border-radius: 10px;
    }
    
    .comp-con-2 {
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        align-items: center;
        padding: 8px;
        position: absolute;
        width: 300px;
        height: 140px;
        left: 610px;
        top: 190px;
        background: #FFEEDB;
        box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
        border-radius: 10px;
    }
    
    .comp-con-3 {
        display: flex;
        flex-direction: column;
        justify-content: space-between;
        align-items: center;
        padding: 10px 9px;
        position: absolute;
        width: 300px;
        height: 140px;
        left: 610px;
        top: 400px;
        background: #FFEEDB;
        box-shadow: 1px 1px 2px rgba(0, 0, 0, 0.25);
        border-radius: 10px;
    }

我基本上是四张css卡四次投诉,有一张for.loopcounter来统计html中的投诉。当页面更改为新页面时,如何将 forloopcounter 设置回零。更重要的是,如何为此添加分页?

对于分页,您应该考虑 Django 文档 https://docs.djangoproject.com/en/3.2/topics/pagination/

from django.core.paginator import Paginator
def pagination_complaint(request, page_no):
    complaint_data_paginator = Paginator(complaint_data, 4)
    paginator_obj = complaint_data_paginator.get_page(page_no)
    context = {'complaint':paginator_obj}
    return render(request, "<your-app-name>/ajax_complaint.html", context)

在您的应用中创建一个新模板 ajax_complaint.html

{%for c in complaint %}
        <a href="{% url 'Complaint' c.pk %}" style="color:black;">
            <div class="container comp-con-{{forloop.counter0}}">
                <p style="color: #D37A19; margin-left: -130px; margin-top: -5px;">Report number:</p>
                <p class="history-level-1">{{c.reportnumber}}</p>
                <p class="comp-title-1">{{c.event_type}}</p>
                <p class="comp-sub-1">{{c.event_text|truncatechars:85}}</p>
            </div>
        </a> {%endfor%}

在 urls.py 中创建一个新的 URL 以获得分页!

path('<int:page_no>/', pagination_complaint)

现在您必须在第一个模板中添加 ajax! 要在模板中添加数据,请添加一个带有 id="items" 的新 div(它可以是任何东西,但我正在使用它) 现在我要在这里使用jQuery!所以一定要在模板中导入它!

items = document.getElementsById("items");
  $.ajax(
{
    type: "GET",
    URL: "<your pagination URL>/<page_no>/",
    success: function (response) {
      items.innerHTML = items.innerHTML + response
    }
})