Мое мнение: по началу я воспринимал в штыки идеи CBV, действительно, в совокупности строчек кода стало больше, но Mixins это очень круто, намного лучше чем использовать декораторы для переопределения логики вьюхи.
Сейчас я использую подход, где у меня есть вьюхи-схемы, в который определено важное (queryset, пагинатор, кастомные параметры и т.д.), а потом наследую для html-вьюшек и ajax-вьюшек, получается очень красиво. При этом при необходимости добавляю в ajax-вьюшки миксины типа JSONResponseMixin:
# coding: utf-8
import datetime
from django.core.serializers import serialize
from django.utils.simplejson import loads, JSONEncoder
from django.http import HttpResponse
from django.db.models.query import QuerySet, ValuesQuerySet
class DjangoJSONEncoder(JSONEncoder):
def default(self, obj):
if isinstance(obj, datetime.datetime):
return unicode(obj)
if isinstance(obj, ValuesQuerySet):
return list(obj)
if isinstance(obj, QuerySet):
return loads(serialize('json', obj))
return JSONEncoder.default(self, obj)
class JsonResponseMixin(object):
def render_to_response(self, context):
content = DjangoJSONEncoder().encode(context)
return HttpResponse(content, content_type='application/json')
Да, CBV внешне противоречит зену питона, он не простой, но зато удобный и дает больше гибкости!
И вьюшки стали более модульными, как бы это не звучало странно, каждый метод делает только то что необходимо и нету каши из ифов и логики или внешних функций… я могу отдельно определить контекст в зависимости от ситуаций переопределить его в миксине или вьюхе-чилде, и это круто