- PVSM.RU - https://www.pvsm.ru -

Что нового нас ожидает в Django 1.7

В данном посте представлен обзор новшеств и особенностей популярного среди Python разработчиков фреймворка Django 1.7. Релиз позиционируется как сообществом, так и основными разработчиками — как наиболее значимый релиз, с момента выхода в свет Django 1.0.

image

Новшества в версии 1.7

Прекращение поддержки Python 2.6. Теперь поддерживается версия Python 2.7 и выше. Заявлена поддержка Python 3.4.
Добавлена нативная поддержка миграций [1] непосредственно в сам фреймворк. Можно поблагодарить за это автора популярной батарейки South — Andrew Godwin-а [2].

Команда syncdb обьявлена как устаревшая, и скорее всего будет удалена в дальнейшем. Пока еще работает так же, как и прежде.
Фикстуры initial_data более не инициализируются по умолчанию для приложений с миграциями. Предлагается воспользоваться загрузкой фикстур на уровне самих миграций.

Механизм загрузки приложения [3] — был подвергнут полному рефакторингу. В результате можно отказаться от models.py, который ранее идентифицировал приложение и был обязательным.
Новые методы подклассов Field [4]. Главная особенность — это обязательный метод deconstruct(). К сожалению в этом вина включения миграций в состав Django. Если Вы наследуетесь от стандартных полей и не переопределяете метод __init__, то заботиться Вам об этом не придется.

Появилась возможность вызовов QuerySet-ов [5] напрямую из менеджера:

class FoodQuerySet(models.QuerySet):
    def pizzas(self):
        return self.filter(kind='pizza')

    def vegetarian(self):
        return self.filter(vegetarian=True)

class Food(models.Model):
    kind = models.CharField(max_length=50)
    vegetarian = models.BooleanField()
    objects = FoodQuerySet.as_manager()

Food.objects.pizzas().vegetarian()

Возможность указать необходимый менеджер при использовании связывания моделей:

class Blog(models.Model):
    pass

class Entry(models.Model):
    blog = models.ForeignKey(Blog)

    objects = models.Manager()  # Default Manager
    entries = EntryManager()    # Custom Manager

b = Blog.objects.get(id=1)
b.entry_set(manager='entries').all()

Новая система, для проверки проекта(System check), которая при запуске опеделяет проблемы и подсказывает что и как необходимо исправить. Для проверки, используется новая команда check, пришедшая на замену устаревшей команде validate.
Новый Prefetch [6] для продвинутых операций prefetch_related. Теперь можно настроить предварительную выборку используя QuerySet-ы.

Поддержка текущего часового пояса в панели администратора, при работе с виджетом даты. Прежде использовался часовой пояс браузера. При расхождении времени в браузере и на сервере — выводится визуальная подсказка.

Курсор баз данных, теперь может использоваться в качестве контекст менеджера, что является сокращением для:

c = connection.cursor()
try:
    c.execute(...)
finally:
    c.close()

Возможность определения собственных типов поиска [7], для фильтрации при использовании ORM.

from django.db.models import IntegerField
from django.db.models import Transform

class AbsoluteValue(Transform):
    lookup_name = 'abs'

    def as_sql(self, qn, connection):
        lhs, params = qn.compile(self.lhs)
        return "ABS(%s)" % lhs, params

IntegerField.register_lookup(AbsoluteValue)

# Использование
Experiment.objects.filter(change__abs=27)

# В результате получим
# SELECT ... WHERE ABS("experiments"."change") = 27

Другие интересные изменения

django.contrib.admin

  • Появилась возможность реализовать собственные [8] site_header, site_title, и index_title, без необходимости переопределения шаблона.
  • Метод ModelAdmin.get_fields() [9] может быть преопределен, для настройки значений ModelAdmin.fields.
  • В дополнение к существующему синтаксису admin.site.register, можно использовать новый декоратор register() [10].
  • Можно задать ModelAdmin.list_display_links [11] = None, для того что бы отключить ссылки в grid-е
  • Для котроля кнпоки «Посмотреть на сайте», можно определить свой ModelAdmin.view_on_site [12].
  • Возможность указать сортировку для ModelAdmin.list_display [13], подставляя дефис в admin_order_field.
  • Метод ModelAdmin.get_changeform_initial_data() [14] может быть переопределен, для изменения данных формы.

django.contrib.auth

  • **kwargs передаваемые в email_user() [15], так же передаются и в send_mail() [16].
  • декоратор permission_required() [17] может получать на вход список разрешений или же только одно разрешение.
  • возможно переопределить новый метод AuthenticationForm.confirm_login_allowed() [18], для быстрой и легкой настройки политики авторизации.
  • django.contrib.auth.views.password_reset() [19] принимает необязательный параметр html_email_template_name. Параметр используется для отправки html писем, при сбросе пароля .
  • добавлен метод AbstractBaseUser.get_session_auth_hash() [20]. Если пользовательская модель унаследована от AbstractBaseUser [21], то изменение пароля пользователя приведет к сбросу его устаревших сесссий.

django.contrib.sites

E-mail

  • В send_mail() [16] добавлен параметр html_message, для отправки сообщений типа text/html.
  • SMTP бекенд [23] получил возможность установить параметр тайм-аута [24].

Загрузка файлов

  • Добавлен атрибут UploadedFile.content_type_extra [25], который содержит дополнительные параметры, передаваемые в заголовоке типа содержимого при загрузке файлов.
  • Новая настройка FILE_UPLOAD_DIRECTORY_PERMISSIONS [26] позволяет задавать права на создаваемые директории при загрузке файлов. Ту же настройку непосредственно для файлов, выполняет FILE_UPLOAD_PERMISSIONS [27].
  • FileField.upload_to [28] теперь является необязательным.

Формы

  • Textarea теперь включает атрибут max_length, если в модели определен max_length.
  • Field.choices позволяет задать value для пустого значения. По умолчанию "-------".
  • В формах в методе clean() более не требуется возвращать self.cleaned_data.
  • Появилась возможность удалить поля из формы, путем установки их имени в None.
  • Новый метод add_error() позволяет задавать ошибки для конкретных полей.
  • Добавлена возможность задавать и выводить ошибки к ограничителям вида unique, unique_for_date, и unique_together.

Интернационализация

  • Атрибут django.middleware.locale.LocaleMiddleware.response_redirect_class [29] позволяет настроить переадресацию.
  • LocaleMiddleware [30] хранит выбранный язык пользователем язык в _language. Получить доступ, можно используя константу LANGUAGE_SESSION_KEY.
  • Тег blocktrans [31] удаляет атрибут trimmed. Данная опция удаляет символы новой строки с начала и до конца, обьеденяя их через пробел. Что удобно для генерации файлов локали.
  • Улучшен makemessages [32].
  • Были добавлены следущие языковые константы: LANGUAGE_COOKIE_AGE, LANGUAGE_COOKIE_DOMAIN and LANGUAGE_COOKIE_PATH.

Команды управления

  • Возможность отключить цветной вывод в консоль.
  • Добавлена возможность дампа данных с первичными ключами при сериализации.
  • Нет необходимости указывать название кеш таблицы при использовании createcachetable. Теперь Django это делает сама, с учетом настройки кеша в настройках проекта.
  • Команда runserver была улучшена. Теперь при установленном pyinotify, скорость релоада стала выше, и меньше потребляет батарею на ноутах. Так же сервер релоадиться при использовании команды compilemessages. Выводятся в консоль все запросы к статике, которые прежде фильтровались.

Модели

  • Новый метод QuerySet.update_or_create() [33].
  • Новая Meta опция default_permissions [34], которая позволяет настроить операции создания/изменения/удаления.
  • Обнаружение OneToOneField при наследовании в абстрактных классах.
  • Добавлена возможность использовать None в качестве значения запроса при использовании iexact [35].
  • Возможность использования одиного списока в index_together [36] при указании одного набора полей(не список в списках).
  • Числовые поля теперь проверяются в зависимости от БД. Ранее могло приводить к ошибке.

Запросы и ответы

  • Новый атрибут HttpRequest.scheme [37] определяет схему запроса (http или https).
  • redirect() [38] поддерживает относительный URL.
  • Новый подкласс HttpResponse — JsonResponse [39].

Утилиты

Данный пост является вольным интерпретированием официальной документации находящейся в стадии разработки, и носит исключительно ознакомительный характер.
В него включены наиболее интересные вещи с точки зрения автора поста. Для более подробного и детального ознакомления, можно
перейти на страницу документации [41].

Автор: gotlium

Источник [42]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/django-2/60793

Ссылки в тексте:

[1] миграций: https://docs.djangoproject.com/en/dev/topics/migrations/

[2] Andrew Godwin-а: https://github.com/andrewgodwin

[3] загрузки приложения: https://docs.djangoproject.com/en/dev/ref/applications/

[4] Field: https://docs.djangoproject.com/en/dev/howto/custom-model-fields/#django.db.models.Field

[5] QuerySet-ов: https://docs.djangoproject.com/en/dev/topics/db/managers/#create-manager-with-queryset-methods

[6] Prefetch: https://docs.djangoproject.com/en/dev/ref/models/queries/#django.db.models.Prefetch

[7] типов поиска: https://docs.djangoproject.com/en/dev/ref/models/custom-lookups/#django.db.models.Lookup

[8] собственные: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.AdminSite.site_header

[9] ModelAdmin.get_fields(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_fields

[10] декоратор register(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.register

[11] ModelAdmin.list_display_links: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display_links

[12] ModelAdmin.view_on_site: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.view_on_site

[13] ModelAdmin.list_display: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_display

[14] ModelAdmin.get_changeform_initial_data(): https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_changeform_initial_data

[15] email_user(): https://docs.djangoproject.com/en/dev/ref/contrib/auth/#django.contrib.auth.models.User.email_user

[16] send_mail(): https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.send_mail

[17] permission_required(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.decorators.permission_required

[18] AuthenticationForm.confirm_login_allowed(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.forms.AuthenticationForm.confirm_login_allowed

[19] django.contrib.auth.views.password_reset(): https://docs.djangoproject.com/en/dev/topics/auth/default/#django.contrib.auth.views.password_reset

[20] AbstractBaseUser.get_session_auth_hash(): https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser.get_session_auth_hash

[21] AbstractBaseUser: https://docs.djangoproject.com/en/dev/topics/auth/customizing/#django.contrib.auth.models.AbstractBaseUser

[22] django.contrib.sites.middleware.CurrentSiteMiddleware: https://docs.djangoproject.com/en/dev/ref/middleware/#django.contrib.sites.middleware.CurrentSiteMiddleware

[23] SMTP бекенд: https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.backends.smtp.EmailBackend

[24] тайм-аута: https://docs.djangoproject.com/en/dev/topics/email/#django.core.mail.backends.smtp.EmailBackend.timeout

[25] UploadedFile.content_type_extra: https://docs.djangoproject.com/en/dev/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile.content_type_extra

[26] FILE_UPLOAD_DIRECTORY_PERMISSIONS: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FILE_UPLOAD_DIRECTORY_PERMISSIONS

[27] FILE_UPLOAD_PERMISSIONS: https://docs.djangoproject.com/en/dev/ref/settings/#std:setting-FILE_UPLOAD_PERMISSIONS

[28] FileField.upload_to: https://docs.djangoproject.com/en/dev/ref/models/fields/#django.db.models.FileField.upload_to

[29] django.middleware.locale.LocaleMiddleware.response_redirect_class: https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware.response_redirect_class

[30] LocaleMiddleware: https://docs.djangoproject.com/en/dev/ref/middleware/#django.middleware.locale.LocaleMiddleware

[31] blocktrans: https://docs.djangoproject.com/en/dev/topics/i18n/translation/#std:templatetag-blocktrans

[32] makemessages: https://docs.djangoproject.com/en/dev/ref/django-admin/#django-admin-makemessages

[33] QuerySet.update_or_create(): https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.update_or_create

[34] default_permissions: https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.default_permissions

[35] iexact: https://docs.djangoproject.com/en/dev/ref/models/querysets/#std:fieldlookup-iexact

[36] index_together: https://docs.djangoproject.com/en/dev/ref/models/options/#django.db.models.Options.index_together

[37] HttpRequest.scheme: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.HttpRequest.scheme

[38] redirect(): https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#django.shortcuts.redirect

[39] JsonResponse: https://docs.djangoproject.com/en/dev/ref/request-response/#django.http.JsonResponse

[40] strip_tags(): https://docs.djangoproject.com/en/dev/ref/utils/#django.utils.html.strip_tags

[41] документации: https://docs.djangoproject.com/en/dev/releases/1.7/

[42] Источник: http://habrahabr.ru/post/224249/