Объект ListView View не имеет атрибута «объект» - PullRequest
2 голосов
/ 14 мая 2019

Раньше у меня было представление как DetailView, но когда я хотел добавить нумерацию страниц, мне нужно было изменить представление на ListView. Но после этого он начал выдавать эту ошибку: 'CategoryDetailView' object has no attribute 'object' Я считаю, что мне нужно присвоить категории себе, но я не уверен на 100%, как это сделать.

Я пробовал:

def category(self , request , *args , **kwargs):
        self.object = self.get_object()
        return self.object

Но это не сработало, так что сейчас это так.

Вид:

class CategoryDetailView(ListView):
    model = Category
    paginate_by = 1

    def get_context_data(self, **kwargs):
        context = super(CategoryDetailView, self).get_context_data(**kwargs)
        context['category_posts'] = Post.objects.filter(live=True, category=self.object)
        return context

Спасибо, ребята

1 Ответ

1 голос
/ 14 мая 2019

Использование DetailView

A ListView используется для визуализации списка объектов указанного вами model. Здесь, однако, вы хотите получить только один Category и Post этой категории, поэтому вы должны использовать DetailView [Django- документ] . Как указано в документации, такое представление содержит self.object:

Во время выполнения этого представления self.object будет содержать объект , с которым работает представление.

from django.views.generic import <b>DetailView</b>

class CategoryDetailView(<b>DetailView</b>):
    model = Category

    def get_context_data(self, **kwargs):
        context = super(CategoryDetailView, self).get_context_data(**kwargs)
        context['category_posts'] = <b>self.object.post_set.filter(live=True)</b>
        return context

кроме того, нет смысла использовать атрибут paginate_by, поскольку DetailView, конечно, всегда отображает ровно один элемент.

В URL вы, вероятно, указываете параметр с именем pk или параметр с именем slug (учитывая, что Category имеет поле slug). DetailView автоматически получит Category, который соответствует этому pk / slug.

Использование ListView

Кроме того, вы можете использовать ListView, но в этом случае ListView из Post с. Действительно, мы можем построить такие ListView как:

from django.views.generic import <b>ListView</b>

class CategoryDetailView(<b>ListView</b>):
    model = <b>Post</b>
    paginate_by = 20

    def get_queryset(self):
        return super().get_queryset().filter(<b>category__id=self.kwargs['pk']</b>)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['category'] = <b>Category.objects.get(id=self.kwargs['pk'])</b>
        return context

Здесь мы можем получить релевантный Category, обратившись к pk в параметрах URL. Однако здесь мы реализуем представление списка поверх Post s .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...