来自doc的Django分页不起作用

时间:2016-07-18 09:20:02

标签: python django

我从官方django文档中引用了分页代码。我没有收到任何错误,但所有对象都显示在同一页面中。我在视图中有十个对象,我给了5个对象(带有详细信息的书籍图像)显示在每个页面中,但所有10个对象都显示在第1页和第2页中。

views.py,

def add_prod(request):
    form = ProdForm(request.POST or None,request.FILES or None)
    my_products_list = Add_prod.objects.all()
    paginator = Paginator(my_products_list,5)
    page = request.GET.get('page')
    try:
        queryset = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        queryset = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        queryset = paginator.page(paginator.num_pages)

    context = {
            "form":form,
            "products":my_products_list,
            "obj_list":queryset
    }

    if form.is_valid():
        form.save()
        messages.add_message(request, messages.INFO,'Product Added')
        return redirect("add_prod")

    return render(request,"add-prod.html",context)

我的模板文件的一小部分,

<form id="mystyle">

        <table align="center">
            <tr class="tableHeader">
                <th>Books</th>
                <th>Author</th>
                <th>Price</th>
                <th>Category</th>
                <th>Image</th>
                <th>Action</th>
            </tr> 

            {% for i in products %}  
            <tr>
                <td>{{i.book}}</td>
                <td>{{i.author}}</td>
                <td>{{i.price}}</td>
                <td>{{i.cat}}</td>
                <td><img src="{{i.image.url}}" alt="No Image" width=196px height=196px></td>
                <td><button><a href="{% url 'update_prod' pk=i.pk %}">Edit</a></button>
                <button onclick="return confirm('Are you sure want to delete?');"><a href="{% url 'del_prod' pk=i.pk %}">Delete</a></button></td>
            </tr>
            {% endfor %}        
        </table><br>


        <div class="pagination">
            <span class="step-links">
                {% if obj_list.has_previous %}
                    <a href="?page={{ obj_list.previous_page_number }}">previous</a>
                {% endif %}

                <span class="current">
                    Page {{ obj_list.number }} of {{ obj_list.paginator.num_pages }}.
                </span>

                {% if obj_list.has_next %}
                    <a href="?page={{ obj_list.next_page_number }}">next</a>
                {% endif %}
            </span>
        </div>  
    </form>

1 个答案:

答案 0 :(得分:1)

您正在向模板发送my_product_list,这是您在分页前的整个查询集。您的上下文字典应该如下所示:

context = {
        "form":form,
        "products":queryset,
}

然后在模板中,使用{% products.has_next %}依此类推。

说实话,我更喜欢不同的名称,例如只调用您的网页page,而不是queryset,但上述内容应该有效。更好的版本,IMO:

form = ProdForm(request.POST or None,request.FILES or None)
product_list = Add_prod.objects.all()
paginator = Paginator(my_product_list,5)
page = request.GET.get('page')
try:
    product_list = paginator.page(page)
except PageNotAnInteger:
    # If page is not an integer, deliver first page.
    product_list = paginator.page(1)
except EmptyPage:
    # If page is out of range (e.g. 9999), deliver last page of results.
    product_list = paginator.page(paginator.num_pages)

context = {
        "form": form,
        "product_list": product_list,
}

模板:

{% for i in product_list %}  
<tr>
<td>{{i.book}}</td>
<td>{{i.author}}</td>
<td>{{i.price}}</td>
<td>{{i.cat}}</td>
<td><img src="{{i.image.url}}" alt="No Image" width=196px height=196px></td>
<td><button><a href="{% url 'update_prod' pk=i.pk %}">Edit</a></button>
<button onclick="return confirm('Are you sure want to delete?');"><a href="{% url 'del_prod' pk=i.pk %}">Delete</a></button></td>
</tr>
{% endfor %}
</table><br>

<div class="pagination">
        <span class="step-links">
            {% if product_list.has_previous %}
                <a href="?page={{ product_list.previous_page_number }}">previous</a>
            {% endif %}

            <span class="current">
                Page {{ product_list.number }} of {{ product_list.paginator.num_pages }}.
            </span>

            {% if product_list.has_next %}
                <a href="?page={{ product_list.next_page_number }}">next</a>
            {% endif %}
        </span>
    </div>