Вынесение процесса пагинации в отдельный метод в проекте Django
Есть три функции:
def index(request):
"""Выводит шаблон главной страницы"""
post_list = Post.objects.all()
paginator = Paginator(post_list, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {
'page_obj': page_obj
}
return render(request, 'posts/index.html', context)
def group_posts(request, slug):
"""Выводит шаблон с группами постов"""
group = get_object_or_404(Group, slug=slug)
paginator = Paginator(group.posts.all(), 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
posts = group.posts.all()[:10]
context = {
'group': group,
'paginator': paginator,
'page_number': page_number,
'page_obj': page_obj,
'posts': posts,
}
return render(request, 'posts/group_list.html', context)
def profile(request, username):
"""Выводит шаблон профайла пользователя"""
author = get_object_or_404(User, username=username)
paginator = Paginator(author.posts.all(), 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
context = {
'author': author,
'paginator': paginator,
'page_number': page_number,
'page_obj': page_obj,
}
return render(request, 'posts/profile.html', context)
В каждой из трех функций повторяется одна и та же строка кода: page_obj = paginator.get_page(page_number).
Мой ревьювер сказал, что нужно процесс пагинации вынести в отдельный метод, т.к. идет частое повторение одного и того же.
Подскажите, как правильно вынести эту строку в отдельный метод, а потом применить в функциях так, чтобы все не сломалось? :)
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Что-то в таком духе:
def get_page_context(queryset, request):
paginator = Paginator(queryset, 10)
page_number = request.GET.get('page')
page_obj = paginator.get_page(page_number)
return {
'paginator': paginator,
'page_number': page_number,
'page_obj': page_obj,
}
def index(request):
"""Выводит шаблон главной страницы"""
context = get_page_context(Post.objects.all())
return render(request, 'posts/index.html', context)
def group_posts(request, slug):
"""Выводит шаблон с группами постов"""
group = get_object_or_404(Group, slug=slug)
posts = group.posts.all()[:10]
context = {
'group': group,
'posts': posts,
}
context.update(get_page_context(group.posts.all(), request)
return render(request, 'posts/group_list.html', context)
def profile(request, username):
"""Выводит шаблон профайла пользователя"""
author = get_object_or_404(User, username=username)
context = {
'author': author,
}
context.update(get_page_context(author.posts.all(), request)
return render(request, 'posts/profile.html', context)