phpdude,
По сути они были всегда. Так как view может быть любой callable объект принимающий, как минимум один аргумент (request) (функция, метод, экземпляр класса с методом __call__). То есть всегда можно было наваять, что-то типа (как минимум):
class MyView(object):
def __init__(self, template, params):
self.template = template
self.params = params
def get_context(self):
pass
def form_valid_context(self):
pass
def form_invalid_context(self):
pass
def __call__(self, request):
# many logic and call instance methods
return render_to_response(self.template, …,params)
class MyOtherView(MyView):
def some_methods(self):
#
urlpatterns = patterns(''
'^foo$', MyView('foo.html', []),
'^bar$', MyView('bar.hmtl', ),
…..
)
Но школоте это было невдомек и много лет всем было плевать.
Куда проще писать собственные вьюхи-спагетти на сотни строчек с кучами ифов, циклов и прочей херни, местами чуть более чем полностью повторяющие друг друга.
Пока в 1.3 так называемые generic-views не перетащили на классы и не намекнули "мол функции функциями, а с классами то удобнее поди? наследование, примеси, больше гибкости, декларативность и т.д.?"
https://docs.djangoproject.com/en/dev/topics/class-based-views/А школоту этим не сломить. Школоте вообще плевать на generic-views, школота пишет своё попрежнему.