ФорумПрограммированиеPythonDjango → Django's CBVs were a mistake

Django's CBVs were a mistake

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 мая 2012 г. 13:35

    http://lukeplant.me.uk/blog/posts/djangos-cbvs-were-a-mistake/

    Мое мнение: по началу я воспринимал в штыки идеи 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 внешне противоречит зену питона, он не простой, но зато удобный и дает больше гибкости!
    Спустя 166 сек.


    И вьюшки стали более модульными, как бы это не звучало странно, каждый метод делает только то что необходимо и нету каши из ифов и логики или внешних функций… я могу отдельно определить контекст в зависимости от ситуаций переопределить его в миксине или вьюхе-чилде, и это круто
    adw/0
  • adwo

    Сообщения: 913 Репутация: N Группа: Джедаи

    Spritz 30 мая 2012 г. 20:59, спустя 7 часов 24 минуты 26 секунд

    Есть еще ответ на эту статью - http://www.boredomandlaziness.org/2012/05/djangos-cbvs-are-not-mistake-but.html
  • mathete

    Сообщения: 435 Репутация: N Группа: Джедаи

    Spritz 31 мая 2012 г. 3:10, спустя 6 часов 10 минут 30 секунд

    Ахинея. Автор походу вообще не понимает.
    Последние сомнения развеял его AjaxMroFixer.
    Я резюмирую статью так - "я человек недалекий, инструментом пользуюсь через жопу, мои решения убоги - поэтому инструмент сложный".

    1. Причем тут вообще дзен питона (adw0rd, Дзен по-русски пишется именно так :))? Дзен питона применим к уровню употребления конструкций, но не к парадигме. На дзен можно ссылаться в рамках куска кода, чистой функции грубо округляя. Конечно с классами местами больше строчек, и чего? В статье ответе про это речь, кстати, ведется тоже.
    2. CBV - это в первую очередь DSL (в какой-то мере конечно). И, следовательно, одна из главных задач - повышение уровня абстракции (причем значительно, фазово) и понижение уровня разработчика до "не разработчика". Джанговские инструменты декларативны и высокоуровневы как только можно. Посмотрите на модели и формы. Не приходит же никому в голову писать, что джанговские модели чему-то противоречат и сложны.

    Вот код приложения, как оно должно быть:

    class SomeModel(models.Model):
    name = models.CharField(max_length=64)

    class SomeForm(forms.ModelForm):
    class Meta:
    model = SomeModel

    class SomeCreateView(views.):
    template = 'some.html'
    form = SomeForm


    И то, тут можно и без формы и без шаблона. Если у формы доп.логики нет, то можно генерировать в базовом классе, а в воркерах только модель указывать. Имя шаблона можно брать, как кусок названия класса (Дуд, что-то подобное делал) - но это такой уже совсем марафет.
    Ну и с такими инструментами обычный CRUD и несложный REST может сделать пятиклассник, которому не придется объяснять про функции, декораторы, аргументы, контексты и пр. Потому что тут только описания практически на натуральном языке. Ничего лишнего. Вся логика инкапсулирована.

    Кстати, на питоне можно за полчаса и такую реализацию сделать:

    class SomeModel(models.Model):
    name = models.CharField(max_length=64)

    class OtherModel(models.Model):
    name = models.CharField(max_length=64)
    somefield = models.CharField(max_length=64)

    def clean_somefield(self):
    # hard logic
    pass

    urlpatterns += SomeModel > views.Factory('list', 'detail')
    urlpatterns += OtherModel > forms.FormFactory((clean_somefield,)) > views.Factory(['list', 'detail', 'create', 'update'])


    Тут пятикласснику ещё проще. Он описал две модельки с несколькими полями. Для валидации одного из полей ему папа написал сложную логику (это вообще должно импортироваться из другого модуля, чтобы не мешать DSL с реализацией логики). И далее просто описывает - модель > вьюхогенератор с типами действий.
    Подчеркиваю - пятиклассник ОПИСЫВАЕТ, а не ПИШЕТ и тем более не ПРОГРАММИРУЕТ.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 31 мая 2012 г. 3:49, спустя 39 минут 32 секунды

    adw0rd, Дзен по-русски пишется именно так :)

    да я знаю, но мне нравится писать "зен"
    adw/0
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 14 июня 2012 г. 11:47, спустя 14 дней 7 часов 57 минут

  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 27 июня 2012 г. 12:07, спустя 13 дней 20 минут

    Why I don't like class-based generic views Сагалаев, 2011 г.
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!