Как использовать фильтр исключений в 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 }} &mdash; {{ 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')
Вернуться на верх