2014-08-15 2 views
5

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

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 %} 

Я подумал, что мне не нужно было бы использовать для цикла, когда я использую ListView вместо TemplateView; но я не мог перечислить элементы без цикла for. Я нашел пример here, и мне кажется, что разница в том, что в цикле 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»

+0

Спасибо. Диаграммы иерархии в ссылках, которые вы дали, очень полезны. Я также узнал, что могу изменить имя по умолчанию, переопределив функцию get_context_object_name. Я думаю, что понимание разницы явно потребует времени и опыта. Но если вы можете предоставить хороший пример использования ListView, это было бы здорово. Еще раз спасибо! – melis

+0

Пример, который вы дали, - это случай учебника для использования «ListView», даже если вы можете использовать «TemplateView», в этом случае нет причин. С большинством общих представлений на основе классов вы обнаружите, что вы можете заставить их работать, как и другие представления на основе классов, но для типичного варианта использования действительно нет никакого смысла. – crhodes

Смежные вопросы