Досвід «кумедностей» стає все більше і більше. Ось черговий випадок маразму. Коротко суть:
Існує сайт, на якому потрібно виводити одні й ті самі об'єкти з різними умовами вибірки (за категорією, за тегом, «захабарені» тощо) і різними відображеннями (список, детально тощо).
Деякі індивіди створюють в кожному 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 проектах, вже не знаю чому.