В чем разница между использованием 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'