Наследование в классе Django ListView и View [дубликат]


На этот вопрос уже есть ответ здесь:

Может кто-нибудь объяснить, почему это не работает

    class MansionDesign(Listview):
        sequence = Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse()
        queryset = [sequence[i:i + 3] for i in range(0, len(sequence), 3)]
        template_name = 'designs/mansions.html'

Но когда я изменяю вышеупомянутый класс на подкласс вида, как показано ниже,

    class MansionDesign(View):
        def get(self, request):
            sequence = Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse()
            queryset = [sequence[i:i + 3] for i in range(0, len(sequence), 3)]
            return render(request, 'designs/mansions.html', {'object_list': queryset})

Код, кажется, работает просто отлично. Ошибка, которую я получаю от приведенный выше класс- "последовательность имен не определена". Я был бы признателен за некоторые разъяснения по этому вопросу. Заранее спасибо.

1 2

1 ответ:

Цитаты из документов:

ListView принимает два параметра, один как queryset и второй и имя шаблона.

Теперь, если вы попытаетесь определить что-то еще в подклассе ListView, вы получите ошибку. Если вы сделаете что-то вроде ниже:

queryset =[list(Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse())[i:i + 3] for i in range(0, len(list(Design.objects.filter(design_type__name='maisonette').order_by('created_at').reverse())), 3)]
Короче говоря, я удалил переменную темпоральности, которую вы использовали в качестве последовательности. Вышеупомянутый определенно не будет работать, потому что это список. Этот пример был просто для того, чтобы передать суть

Теперь вышеприведенное не кажется если у вас есть сложные запросы, которые вы хотите выполнить и показать с помощью listview, следуйте приведенным ниже примерам. Вы должны определить метод get_queryset, который вернет требуемый объект queryset

class PublisherBookList(ListView):

    template_name = 'books/books_by_publisher.html'

    def get_queryset(self):
        self.publisher = get_object_or_404(Publisher, name=self.args[0])
        return Book.objects.filter(publisher=self.publisher)

Ссылки:

Https://docs.djangoproject.com/en/1.11/topics/class-based-views/generic-display/#generic-views-of-objects