Я пытаюсь отфильтровать элементы, присутствующие в модели «Сообщения», по одному из их атрибутов.
Это мое представление на основе классов:
class FilteredPostListView(ListView):
model = Posts
template_name = "blog/post-category.html"
context_object_name = "posts"
paginate_by = 6
#the actual fuction that should filter the element by their category attribute:
def get_queryset(self):
category = get_object_or_404(Posts, category=self.kwargs.get("category"))
return Posts.objects.filter(category)
Это связанный фрагмент в моем urls.py:
path('category/<category>/', FilteredPostListView.as_view(), name='category')
Когда я набираю URL localhost: 8000 / category / example /, где «example» - это значение атрибута «category», по которому я пытаюсь выполнить фильтрацию, я получить следующие ошибки:
Если несколько объектов сообщений имеют категорию атрибута со значением «пример»:
MultipleObjectsReturned at /category/example/
get() returned more than one Posts -- it returned 2!
Если только один объект сообщений имеет категорию атрибута со значением «пример»:
TypeError at /category/example/
cannot unpack non-iterable Posts object
Почему он возвращает не повторяющиеся объекты?
ОБНОВЛЕНИЕ:
если метод def get_queryset()
изменен на более упрощенную версию со значением атрибут "категория" жестко запрограммирован, как этот:
def get_queryset(self):
return Posts.objects.filter(category="example")
Тогда код работает безупречно, и представление на основе класса возвращает повторяемые объекты, для которых для атрибута «категория» установлено значение «пример», и это может быть отображается в шаблоне с for
codeblock.
Но я не могу жестко закодировать значение атрибута "category" каждый раз, когда я хочу фильтровать свои объекты "Сообщения" по атрибуту.
Итак, проблема заключается в более сложная версия метода:
def get_queryset(self):
category = self.kwargs.get("category")
return Posts.objects.filter(category).order_by("-date_posted")
Это по какой-то причине возвращает не повторяемые объекты.