Django нумерация страниц в TemplateView? - PullRequest
0 голосов
/ 20 февраля 2019

Размножение Django в TemplateView?

Здравствуйте, я пытаюсь выяснить, как я могу получить доступ к нескольким моделям в представлении классов и разбить их на страницы.

Мой результат после прочтения DjangoDoc и Stackoverflow:

ListView - я просто могу использовать paginate_by=, но могу загрузить только одну модель.

TemplateView -Я могу загрузить много моделей, но не могу использовать paginate_by=?

Например, три модели: Chicken, Cows и Cats (и я хочу отобразить на своей странице последние 3 записи каждогомодель).У всех моделей есть поле модели, которое называется дата ввода.

class HomeIndex(TemplateView):
   template_name = 'home.html'
   paginate_by = 3 # --- something like that

   def get_context_data(self, **kwargs):
      context = super(HomeIndex, self).get_context_data(**kwargs)
      context['chickens'] = Chicken.objects.order_by('-entry_date'')
      context['cows'] = Cows.objects.order_by('-entry_date'')
      context['cats'] = Cats.objects.order_by('-entry_date')

      return context

Или, может быть, я могу что-то добавить к objects.order_by('-entry_date', < pagination? >).

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Django QuerySet имеет встроенную нарезку результатов.

 Cows.objects.order_by('-entry_date'')[offset:limit]

Для последних 3 записей смещение равно 0, а ограничение 3

 Cows.objects.order_by('-entry_date'')[0:3]

или то же самое можно записать вболее питонический способ

 Cows.objects.order_by('-entry_date'')[:3]

Чтобы получить последних 3 коров, кошек и цыплят, будет работать следующий код.

def get_context_data(self, **kwargs):
    context = super(HomeIndex, self).get_context_data(**kwargs)
    context['chickens'] = Chicken.objects.order_by('-entry_date')[:3]
    context['cows'] = Cows.objects.order_by('-entry_date')[:3]
    context['cats'] = Cats.objects.order_by('-entry_date')[:3]


    return context

Ссылки:

0 голосов
/ 20 февраля 2019

Если вы хотите использовать ListView, вы все еще можете это сделать, связав наборы запросов в get_queryset(self) и разбив их на страницы (прочитайте этот ответ , чтобы увидеть объяснения chain и sorted).Таким образом, вы можете использовать простую нумерацию страниц по умолчанию.

from itertools import chain
from operator import attrgetter

class HomeIndex(ListView):
    template_name = 'home.html'
    paginate_by = 3 # --- somehting like that

    def get_queryset(self):
        chicken_list = Chicken.objects.all()
        cow_list = Cows.objects.all()
        cat_list = Cats.objects.all()

        result_list = sorted(
            chain(chicken_list, cow_list, cat_list),
            key=attrgetter('entry_date'),
            reverse=True)

        return result_list

Затем в вашем шаблоне:

{% for data in object_list %}
    {{ data }} 
{% endfor %}

И вы можете использовать нумерацию страниц, как показано здесь .

...