Где включить бизнес-логику в методы класса listview
Я пытаюсь понять представления, основанные на классах Django (очень новые для него), особенно ListView. Я изо всех сил пытаюсь понять, куда должна идти "бизнес-логика". Скажем, например, у меня есть следующий класс:
#views.py
class DisplayListView(ListView):
model = Cars
template_name = "searchres_list.html"
paginate_by = '5'
context_object_name = "titles"
def get_context_data(self, **kwargs):
context = super(SearchDisplayListView, self).get_context_data(**kwargs)
# custom logic whoch spits out "now". in this example [1 -->10]
context['now'] = [1,2,3,4,5,6,7,8,9,10]
return context
Он отлично работает, и я могу посмотреть [1 -> 10] на моем шаблоне. Однако, когда я смотрю на методы, доступные в ListView, я вижу, что, возможно, я мог бы включить свою логику в метод get_queryset. Итак, что-то вроде:
def get_queryset(self):
# Fetch the queryset from the parent get_queryset
queryset = super(SearchDisplayListView, self).get_queryset()
# custom logic whoch spits out "now". in this example [1 -->10]
queryset = [1,2,3,4,5,6,7,8,9,10]
return queryset
Итак, мой довольно (глупый) вопрос (или я все это неправильно понял!), Куда в идеале должна идти бизнес-логика:
- def get_context_data
- def get_queryset
Спасибо за ваше время.
1 ответ
Решение
Вероятно, лучшим ответом на такой субъективный вопрос будет: это зависит.
Мой личный алгоритм для решения подобных ситуаций следующий:
- если вам нужно добавить что-то в контекст, который будет передан в шаблон, у вас фактически нет выбора, потому что в методе get_queryset вы можете изменить только набор запросов для вашего ListView. Поэтому я использую get_context_data в этом случае.
- но если вы собираетесь выполнить некоторые динамические модификации набора запросов, допустим, что ваше представление может работать с аналогичными классами модели, а фактический класс определяется аргументами, передаваемыми в представление, то, вероятно, вам нужно перезаписать метод get_queryset.
Надеюсь, я дал вам некоторые идеи по теме:)