В данном посте представлен обзор новшеств и особенностей популярного среди Python разработчиков фреймворка Django 1.7. Релиз позиционируется как сообществом, так и основными разработчиками — как наиболее значимый релиз, с момента выхода в свет Django 1.0.
Новшества в версии 1.7
Прекращение поддержки Python 2.6. Теперь поддерживается версия Python 2.7 и выше. Заявлена поддержка Python 3.4.
Добавлена нативная поддержка миграций непосредственно в сам фреймворк. Можно поблагодарить за это автора популярной батарейки South — Andrew Godwin-а.
Команда syncdb обьявлена как устаревшая, и скорее всего будет удалена в дальнейшем. Пока еще работает так же, как и прежде.
Фикстуры initial_data более не инициализируются по умолчанию для приложений с миграциями. Предлагается воспользоваться загрузкой фикстур на уровне самих миграций.
Механизм загрузки приложения — был подвергнут полному рефакторингу. В результате можно отказаться от models.py, который ранее идентифицировал приложение и был обязательным.
Новые методы подклассов Field. Главная особенность — это обязательный метод deconstruct(). К сожалению в этом вина включения миграций в состав Django. Если Вы наследуетесь от стандартных полей и не переопределяете метод __init__, то заботиться Вам об этом не придется.
Появилась возможность вызовов QuerySet-ов напрямую из менеджера:
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 для продвинутых операций prefetch_related. Теперь можно настроить предварительную выборку используя QuerySet-ы.
Поддержка текущего часового пояса в панели администратора, при работе с виджетом даты. Прежде использовался часовой пояс браузера. При расхождении времени в браузере и на сервере — выводится визуальная подсказка.
Курсор баз данных, теперь может использоваться в качестве контекст менеджера, что является сокращением для:
c = connection.cursor()
try:
c.execute(...)
finally:
c.close()
Возможность определения собственных типов поиска, для фильтрации при использовании 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
- Появилась возможность реализовать собственные site_header, site_title, и index_title, без необходимости переопределения шаблона.
- Метод ModelAdmin.get_fields() может быть преопределен, для настройки значений ModelAdmin.fields.
- В дополнение к существующему синтаксису admin.site.register, можно использовать новый декоратор register().
- Можно задать ModelAdmin.list_display_links = None, для того что бы отключить ссылки в grid-е
- Для котроля кнпоки «Посмотреть на сайте», можно определить свой ModelAdmin.view_on_site.
- Возможность указать сортировку для ModelAdmin.list_display, подставляя дефис в admin_order_field.
- Метод ModelAdmin.get_changeform_initial_data() может быть переопределен, для изменения данных формы.
django.contrib.auth
- **kwargs передаваемые в email_user(), так же передаются и в send_mail().
- декоратор permission_required() может получать на вход список разрешений или же только одно разрешение.
- возможно переопределить новый метод AuthenticationForm.confirm_login_allowed(), для быстрой и легкой настройки политики авторизации.
- django.contrib.auth.views.password_reset() принимает необязательный параметр html_email_template_name. Параметр используется для отправки html писем, при сбросе пароля .
- добавлен метод AbstractBaseUser.get_session_auth_hash(). Если пользовательская модель унаследована от AbstractBaseUser, то изменение пароля пользователя приведет к сбросу его устаревших сесссий.
django.contrib.sites
- Новая мидлварь django.contrib.sites.middleware.CurrentSiteMiddleware позволяет установливать текущий сайт при каждом запросе.
- В send_mail() добавлен параметр html_message, для отправки сообщений типа text/html.
- SMTP бекенд получил возможность установить параметр тайм-аута.
Загрузка файлов
- Добавлен атрибут UploadedFile.content_type_extra, который содержит дополнительные параметры, передаваемые в заголовоке типа содержимого при загрузке файлов.
- Новая настройка FILE_UPLOAD_DIRECTORY_PERMISSIONS позволяет задавать права на создаваемые директории при загрузке файлов. Ту же настройку непосредственно для файлов, выполняет FILE_UPLOAD_PERMISSIONS.
- FileField.upload_to теперь является необязательным.
Формы
- 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 позволяет настроить переадресацию.
- LocaleMiddleware хранит выбранный язык пользователем язык в _language. Получить доступ, можно используя константу LANGUAGE_SESSION_KEY.
- Тег blocktrans удаляет атрибут trimmed. Данная опция удаляет символы новой строки с начала и до конца, обьеденяя их через пробел. Что удобно для генерации файлов локали.
- Улучшен makemessages.
- Были добавлены следущие языковые константы: LANGUAGE_COOKIE_AGE, LANGUAGE_COOKIE_DOMAIN and LANGUAGE_COOKIE_PATH.
Команды управления
- Возможность отключить цветной вывод в консоль.
- Добавлена возможность дампа данных с первичными ключами при сериализации.
- Нет необходимости указывать название кеш таблицы при использовании createcachetable. Теперь Django это делает сама, с учетом настройки кеша в настройках проекта.
- Команда runserver была улучшена. Теперь при установленном pyinotify, скорость релоада стала выше, и меньше потребляет батарею на ноутах. Так же сервер релоадиться при использовании команды compilemessages. Выводятся в консоль все запросы к статике, которые прежде фильтровались.
Модели
- Новый метод QuerySet.update_or_create().
- Новая Meta опция default_permissions, которая позволяет настроить операции создания/изменения/удаления.
- Обнаружение OneToOneField при наследовании в абстрактных классах.
- Добавлена возможность использовать None в качестве значения запроса при использовании iexact.
- Возможность использования одиного списока в index_together при указании одного набора полей(не список в списках).
- Числовые поля теперь проверяются в зависимости от БД. Ранее могло приводить к ошибке.
Запросы и ответы
- Новый атрибут HttpRequest.scheme определяет схему запроса (http или https).
- redirect() поддерживает относительный URL.
- Новый подкласс HttpResponse — JsonResponse.
Утилиты
- Улучшен strip_tags().
Данный пост является вольным интерпретированием официальной документации находящейся в стадии разработки, и носит исключительно ознакомительный характер.
В него включены наиболее интересные вещи с точки зрения автора поста. Для более подробного и детального ознакомления, можно
перейти на страницу документации.
Автор: gotlium