Где включить бизнес-логику в методы класса 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

Итак, мой довольно (глупый) вопрос (или я все это неправильно понял!), Куда в идеале должна идти бизнес-логика:

  1. def get_context_data
  2. def get_queryset

Спасибо за ваше время.

1 ответ

Решение

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

Мой личный алгоритм для решения подобных ситуаций следующий:

  • если вам нужно добавить что-то в контекст, который будет передан в шаблон, у вас фактически нет выбора, потому что в методе get_queryset вы можете изменить только набор запросов для вашего ListView. Поэтому я использую get_context_data в этом случае.
  • но если вы собираетесь выполнить некоторые динамические модификации набора запросов, допустим, что ваше представление может работать с аналогичными классами модели, а фактический класс определяется аргументами, передаваемыми в представление, то, вероятно, вам нужно перезаписать метод get_queryset.

Надеюсь, я дал вам некоторые идеи по теме:)

Другие вопросы по тегам