Как превратить переменную представления на основе класса в представление на основе функции? - PullRequest
0 голосов
/ 07 июня 2019

В представлении на основе класса я могу просто пойти "paginate_by = 8" и в HTML я могу сделать

{% if page_obj.has_previous %}
     <a class="btn btn-outline-info mb-4" href="?page=1">First</a>
     <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>
{% endif %}

Но что касается функций, основанных на представлении функций, могу ли я что-либо сделать, например paginate_by, так, чтобы мне не нужно было изменять мой HTML по сравнению с тем, что у меня есть?

1 Ответ

1 голос
/ 07 июня 2019

Да, вы можете реализовать нумерацию страниц [Django-doc] самостоятельно, например:

from app.models import SomeModel
from django.core.paginator import <b>Paginator</b>
from django.http import Http404
from django.shortcuts import render

def some_view(request):
    paginate_by = 8
    qs = SomeModel.objects.all()
    page = request.GET.get('page') or 1
    try:
        page = int(page)
    except ValueError:
        raise Http404('Invalid page number')
    paginator = <b>Paginator(qs, paginate_by)</b>
    try:
        page = paginator.page(page)
    except InvalidPage as e:
        raise Http404('Invalid page number')
    return render(
        request,
        'some_template.html',
        {'page_obj': page, 'object_list': page.object_list}
    )

Таким образом, мы используем объект Paginator [Django-doc] для разбиения на страницы набора запросов.

Это более или менее то, что MultipleObjectMixin делает, чтобы разбить результат на страницы. Но вышеприведенное на самом деле уже в некоторой степени показывает, что для таких представлений лучше использовать представление на основе классов, чтобы можно было удалить шаблонный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...