Как стать автором
Обновить

Разные варианты отображения для одних и тех же данных

Время на прочтение2 мин
Количество просмотров1.5K
Опыт «забавностей» становится всё больше и больше. Вот очередной случай маразма. Коротко суть:
Существует сайт, на котором нужно выводить одни и те же объекты с разными условиями выборки (по категории, по тегу, «захабареные» и т.п.) и разными отображениями (список, подробно и т.п.).

Некоторые индивиды, создают в каждом view замысловатую структуру из if-ов, и каждый раз она повторяется. Запомните:
  1. Рефакторинг
  2. Рефакторинг
  3. Рефакторинг
  4. view — это просто функция!

И так, по последнему пункту. Многие не понимают, что view это всего-лишь функция, возвращающая HttpResponse и не более, поэтому куда грамотнее выделить специфичные для конкретного отображения действия, да и вообще выбор отображения в отдельную функцию. Это легко делается вызовом в конце основного вида:
return extra_view(request, objects=myobjects)

Для полноты восприятия, приведу код по-больше.
def list(request):
    """
    Выводит списко всех объектов
    """
    myset = MyDataObject.objects.all()
    return extra_view(request, myset)
def category(request, category_id):
    """
    Выводит список объектов по категории
    """
    category = get_object_or_404(Category, pk=category_id)
    myset = MyDataObject.objects.filter(category=category)
    return extra_view(request, myset)
def extra_view(request, object_set):
    """
    Обёртка
    """
    view_type = request.GET.get('view_type', 'list')
    return render_to_response('view_type/%s.html' % view_type', {'objects': object_set}

Это крайне простой пример (извините, немного лень писать больше, а рабочий код, по понятным причинам, показать не могу). У меня же ещё навешаны: сортировка, выборка по дате и пр.
Замечу, что можно легко использовать декораторы, и тогда немного поменяется всё, но это мелочи (вместо того, чтобы возвращать extra_view, функция будет возвращать просто object_set; мне просто более понятен представленный подход)

P.S> Помните об эффективности и красоте кода, это крайне важно.
P.P.S> Конечно, это статья скорее о рефакторинге и MVC, но встречаю данную ошибку чаще всего в django проектах, уж не знаю почему.
Теги:
Хабы:
Всего голосов 13: ↑8 и ↓5+3
Комментарии5

Публикации

Истории

Работа

Python разработчик
117 вакансий

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань