Необходимо ли иметь модель и наследование в представлениях, основанных на классах?

class home(ListView):
    template_name='blog/base.html' 

Это не работает и выдает такую ошибку --

Неправильная конфигурация в /. home не хватает QuerySet. Определите home.model, home.queryset или переопределите home.get_queryset().

но когда я создаю модель без данных

class home(ListView):
    model = Post
    template_name='blog/base.html'

Это работает совершенно нормально

-> Таким же образом, когда я не наследую ListView

class home():
        model = Post
        template_name='blog/base.html'

В urls.py

возникает следующая ошибка
from django.urls import path,include
from . import views
from .views import home

urlpatterns = [
    # path('',views.home,name='blog-home'),
    path('',home.as_view(),name='blog-home')
]

AttributeError: объект типа 'home' не имеет атрибута 'as_view'

У меня нет никакого представления о них обоих

Да, передача modal важна в django generic views, потому что ListView наследуется от BaseListView, который снова наследуется от MultipleObjectMixin. MultipleObjectMixin делает обязательным передачу modal в query_set.

Смотрите Django код MultipleObjectMixin для лучшего понимания.

Я согласен с ответом "Vivek Singh".

Но кроме этого, ваш второй вопрос, где вы не наследуете ListView, вы получаете ошибку в урлах, потому что, чтобы as_view() работала, вы должны наследовать какой-то класс View. Например, ListView, DetailView (которые относятся к Generic Views) или просто View.

В моем понимании ваши вопросы скорее направлены на "причину почему", а не столько на код:

Django на основе классов ListView/DetailedView и т.д. сделаны с целью упростить типичные веб-страницы со списком и деталями, например, товаров, которые хранятся в таблице базы данных (=django model). Таким образом, снижается трудоемкость кодирования. Поэтому требуется модель, которая содержит элементы для перечисления и детализации. Если данная модель пуста, то ее можно найти только во время выполнения, когда вызывается страница списка и выполняется запрос - тогда вы просто получите веб-страницу с пустым списком продуктов.

Также наследование от ListView и определение модели имеет смысл только в том случае, если на отрисованном html-шаблоне вы используете (автоматически) заполненный контекст для отображения списка моделей.

вот что происходит, когда вы вызываете ListView.as_view():
-> запрос
-> диспетчеризация запроса через urls.py
-> YourListView.as_view()
-> инстанцируем YourListView с моделью
-> заполняем контекст результатом запроса модели (!!!)
-> рендерим html шаблон с контекстом
-> return response

Если вам не нужен список/детали модели, то, очевидно, нет необходимости наследоваться от этих стандартных представлений. Тогда у вас просто другие потребности.

Вы можете свободно определять свои собственные представления на основе классов, без функциональности, предоставляемой ListView и т.д.

Вернуться на верх