Как использовать фильтр исключений в django classic view для страницы записи блога?
Я пишу код для django для вывода списка постов в ListView и DetailView: преобразование из функционального представления в классное. Я могу добиться отображения всех постов, но я хочу, чтобы в списке отображались только опубликованные посты.
Я знаю, что могу использовать published = Post.objects.exclude(published_date__exact=None) posts = published.order_by('-published_date')
но как мне заставить только переменную posts отображаться в шаблоне, вместо всех объектов Post в post_list (в шаблоне list.html)?
views.py:
from blogging.models import Post
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
class PostListView(ListView):
model = Post
template_name = 'blogging/list.html'
published = Post.objects.exclude(published_date__exact=None)
posts = published.order_by('-published_date')
class PostDetailView(DetailView):
model = Post
template_name = 'blogging/detail.html'
urls.py
from django.urls import path
from blogging.views import PostListView, PostDetailView
urlpatterns = [
path('', PostListView.as_view(), name="blog_index"),
path('posts/<int:pk>/', PostDetailView.as_view(), name="blog_detail"),
]
list.html:
{% extends "base.html" %}{% block content %}
<h1>Recent Posts</h1>
{% comment %} here is where the query happens {% endcomment %}
{% for post in post_list %}
<div class="post">
<h2><a href="{% url 'blog_detail' post.pk %}">{{ post }}</a></h2>
<p class="byline">
Posted by {{ post.author.username }} — {{ post.published_date }}
</p>
<div class="post-body">
{{ post.text }}
</div>
<ul class="categories">
{% for category in post.categories.all %}
<li>{{ category }}</li>
{% endfor %}
</ul>
</div>
{% endfor %}
{% endblock %}
Я нашел ответ:
view.py:
from blogging.models import Post
from django.views.generic.list import ListView
#...
class PostListView(ListView):
model = Post
template_name = 'blogging/list.html'
def get(self, request):
published = Post.objects.exclude(published_date__exact=None)
posts = published.order_by('-published_date')
context = {'post_list': posts}
return render(request, 'blogging/list.html', context)
Вам необходимо переопределить метод get_queryset() в представлении
class PostListView(ListView):
model = Post
template_name = 'blogging/list.html'
def get_queryset(self):
return Post.objects.exclude(published_date__exact=None).order_by('-published_date')