Опыт «забавностей» становится всё больше и больше. Вот очередной случай маразма. Коротко суть:
Некоторые индивиды, создают в каждом view замысловатую структуру из if-ов, и каждый раз она повторяется. Запомните:
И так, по последнему пункту. Многие не понимают, что view это всего-лишь функция, возвращающая HttpResponse и не более, поэтому куда грамотнее выделить специфичные для конкретного отображения действия, да и вообще выбор отображения в отдельную функцию. Это легко делается вызовом в конце основного вида:
Для полноты восприятия, приведу код по-больше.
Это крайне простой пример (извините, немного лень писать больше, а рабочий код, по понятным причинам, показать не могу). У меня же ещё навешаны: сортировка, выборка по дате и пр.
Замечу, что можно легко использовать декораторы, и тогда немного поменяется всё, но это мелочи (вместо того, чтобы возвращать extra_view, функция будет возвращать просто object_set; мне просто более понятен представленный подход)
P.S> Помните об эффективности и красоте кода, это крайне важно.
P.P.S> Конечно, это статья скорее о рефакторинге и MVC, но встречаю данную ошибку чаще всего в django проектах, уж не знаю почему.
Существует сайт, на котором нужно выводить одни и те же объекты с разными условиями выборки (по категории, по тегу, «захабареные» и т.п.) и разными отображениями (список, подробно и т.п.).
Некоторые индивиды, создают в каждом view замысловатую структуру из if-ов, и каждый раз она повторяется. Запомните:
- Рефакторинг
- Рефакторинг
- Рефакторинг
- 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 проектах, уж не знаю почему.