В чем разница между использованием TemplateView и ListView в Django?

В базе данных у меня есть множество вопросов. Я хочу отобразить каждый вопрос в виде сворачиваемого элемента в виде списка. Ранее я использовал TemplateView:

class questionmanager(TemplateView):
    template_name = 'questionmanager.html'
    questions = Question.objects.all() 

    def get_context_data(self, **kwargs):
        context = ({
            'questions': self.questions,
        })
        return context  

Затем я прочитал, что лучше использовать ListView для представления списка объектов. Затем я изменил свой класс на это:

class QuestionListView(ListView):
    model = Question

    def get_context_data(self, **kwargs):
        context = super(QuestionListView, self).get_context_data(**kwargs)
        return context

В старом шаблоне я использовал это для цикла:

{% for question in questions %}

Я думал, что мне не нужно будет использовать цикл for, когда я использую ListView вместо TemplateView; но я не мог перечислить элементы без цикла for. Я нашел здесь пример, и мне кажется, единственное отличие состоит в том, что в цикле for мы используем object_list ({% for question in **object_list** %}) вместо использования аргумента, который мы передаем в контексте.

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

Заранее спасибо.

2 ответа

Решение

Для простых случаев использования, таких как это, особой разницы нет. Тем не менее ListView в этом примере намного чище, так как его можно уменьшить до:

class QuestionListView(ListView):
    model = Question

учитывая, что вы ничего не помещаете в контекст. TemplateView's поскольку базовое представление является довольно элементарным и предоставляет гораздо меньший набор методов и атрибутов для работы с более сложными вариантами использования, что означает, что вам придется писать больше кода в таких случаях. Если вы посмотрите и сравните оба представления TemplateView и ListView, вы сможете увидеть разницу более четко. Нумерация страниц - хороший пример ListView Вы просто устанавливаете paginate_by атрибут и измените ваш шаблон соответственно.

Также обратите внимание, вы можете изменить имя по умолчанию object_list установив context_object_name в "ListView"

Основное отличие состоит в том, что ListView лучше всего подходит для отображения элементов из базы данных, называемой моделью, а TemplateView лучше всего отображает шаблон без модели. Оба взгляда могут быть очень краткими с разным смыслом. Ниже приведен пример представления списка в простейшей форме.

      Class SampleListView(ListView):
    model = ModelName

Это автоматически даст вам контекстную переменную object_list и имя шаблона в форме ("app_name/model_name_list.html"), которые можно использовать для перечисления всех записей в базе данных.

Тем не менее, TemplateView в своей простейшей форме

      class SampleTemplateView(TemplateView):
    template_name = 'app_name/filename.html'
Другие вопросы по тегам