Как правильно получить список последних постов в Django?
Есть вот такой код и мне нужно сделать эту тудушку. Мне кажется должен быть какой-то способ обойти это, сделать функцию либо миксин какой-то, как это правильно будет реализовать в джанго?
def posts_list(request):
posts = Post.objects.filter(published_date__lte=timezone.now())
# TODO: придумать способ получения последних постов без копипаста
last_posts = Post.objects.all()[:3]
return render(request, 'posts/posts_list.html', context={'posts': posts, 'last_posts': last_posts})
def post_details(request, slug):
post = Post.objects.get(slug__iexact=slug)
return render(request, 'posts/post_details.html', context={'post': post})
def categories_list(request):
categories = Category.objects.all()
# TODO: придумать способ получения последних постов без копипаста
last_posts = Post.objects.all()[:3]
return render(request, 'category/categories_list.html', context={'categories': categories, 'last_posts': last_posts})
def category_detail(request, slug):
category = Category.objects.get(slug__iexact=slug)
# TODO: придумать способ получения последних постов без копипаста
last_posts = Post.objects.all()[:3]
return render(request, 'category/category_detail.html', context={'category': category, 'last_posts': last_posts})
Ответы (1 шт):
Автор решения: Владислав
→ Ссылка
После того как написал вопрос, почти сразу нашел решение. Решение такое, с помощью templatetags django Так же я использовал пакет classytags, что позволяет немного упрощенно писать свои теги. Написал один тег, я его могу использовать где угодно, что решает мой вопрос с копипастом.
class LastPosts(Tag):
name = 'last_posts'
options = Options(
'as',
Argument('varname', required=False, resolve=False)
)
def render_tag(self, context, varname, name=name):
last_posts = Post.objects.all()[:3]
if varname:
context[varname] = last_posts
return ''
else:
context[name] = last_posts
return ''