Примечания к выпуску Django 1.8

1 апреля 2015 г.

Добро пожаловать в Django 1.8!

Эти примечания к выпуску охватывают новые функции , а также некоторые обратно несовместимые изменения, о которых вам нужно знать при обновлении с Django 1.7 или более старых версий. Мы также начали процесс прекращения поддержки некоторых функций , а некоторые функции уже устарели и были удалены .

См. Руководство по обновлению Django до новой версии, если вы обновляете существующий проект.

Django 1.8 был обозначен как второй выпуск долгосрочной поддержки Django . Он будет получать обновления безопасности в течение как минимум трех лет после выпуска. Поддержка предыдущего LTS, Django 1.4, закончится через 6 месяцев с даты выпуска Django 1.8.

Совместимость с Python

Django 1.8 требует Python 2.7, 3.2, 3.3, 3.4 или 3.5. Мы настоятельно рекомендуем и официально поддерживаем только последний выпуск каждой серии.

Django 1.8 - первый выпуск, поддерживающий Python 3.5.

В связи с прекращением восходящей поддержки Python 3.2 в феврале 2016 года мы не будем тестировать Django 1.8.x на Python 3.2 после конца 2016 года.

Что нового в Django 1.8

Model._meta API

В Django теперь есть формализованный API для Model._meta , обеспечивающий официально поддерживаемый способ извлечения полей и фильтрации полей на основе их атрибутов .

Этот Model._meta объект был частью Django со времен «Magic Removal» до версии 0.96 - это просто не был официальный стабильный API. Признавая это, мы постарались по возможности поддерживать обратную совместимость со старой конечной точкой API. Однако конечные точки API, которые не являются частью нового официального API, устарели и в конечном итоге будут удалены.

Несколько движков шаблонов

Django 1.8 определяет стабильный API для интеграции бэкэндов шаблонов. Он включает встроенную поддержку языка шаблонов Django и для Jinja2 . Он поддерживает шаблоны рендеринга с несколькими движками в одном проекте. Узнайте больше о новых функциях в тематическом руководстве и ознакомьтесь с инструкциями по обновлению в более старых версиях документации.

Улучшения безопасности

В Django интегрированы несколько функций сторонней библиотеки django-secure . django.middleware.security.SecurityMiddleware обеспечивает несколько улучшений безопасности для цикла запроса / ответа. Новая опция позволяет вам проверить файл производственных настроек на предмет способов повышения безопасности вашего сайта.check --deploy

Новые специфические функции PostgreSQL

Django теперь имеет модуль с расширениями для специфических функций PostgreSQL, такие , как ArrayField , HStoreField , Range Fields и unaccent поиск. Полная разбивка функций доступна в документации .

Новые типы данных

  • В Django теперь есть UUIDField универсальные уникальные идентификаторы. Он хранится как собственный uuid тип данных в PostgreSQL и как символьное поле фиксированной длины на других серверах. Есть соответствующий .form field
  • В Django теперь есть инструмент DurationField для хранения периодов времени - смоделированный на Python с помощью timedelta . Он хранится в собственном interval типе данных в PostgreSQL, как в Oracle и как в микросекундах на других серверах. Арифметика, связанная с датой и временем, также была улучшена на всех серверных ВМ. Есть соответствующий .INTERVAL DAY(9) TO SECOND(6) bigint form field

Выражения запросов, условные выражения и функции базы данных

Выражения запроса позволяют создавать, настраивать и составлять сложные выражения SQL. Это позволило аннотации принимать выражения, отличные от агрегатов. Агрегаты теперь могут ссылаться на несколько полей, а также выполнять арифметические операции, аналогичныеF() объектам. order_by() также получил способность принимать выражения.

Условные выражения позволяют использоватьif ...elif ...else логика в запросах.

Коллекция функций базы данных также включены функциональные возможности, такие как Coalesce , Concat , и Substr .

TestCase настройка данных

TestCase был переработан, чтобы обеспечить возможность инициализации данных на уровне класса с использованием транзакций и точек сохранения. Бэкенды баз данных, которые не поддерживают транзакции, такие как MySQL с механизмом хранения MyISAM, по-прежнему смогут запускать эти тесты, но не выиграют от улучшений. Теперь тесты выполняются в двух вложенных atomic() блоках: один для всего класса и по одному для каждого теста.

  • Метод класса TestCase.setUpTestData() добавляет возможность настройки тестовых данных на уровне класса. Использование этой техники может ускорить тесты по сравнению с использованием setUp() .
  • Загрузка приспособления внутри TestCase теперь выполняется один раз для всего TestCase .

Незначительные особенности

django.contrib.admin

  • ModelAdmin теперь есть has_module_permission() метод, позволяющий ограничить доступ к модулю на странице индекса администратора.
  • InlineModelAdmin теперь имеет атрибут, show_change_link который поддерживает отображение ссылки на форму изменения встроенного объекта.
  • Используйте новый django.contrib.admin.RelatedOnlyFieldListFilter вход, ModelAdmin.list_filter чтобы ограничить list_filter выбор посторонними предметами, которые прикреплены к предметам из ModelAdmin .
  • На ModelAdmin.delete_view() странице подтверждения удаления отображается сводка объектов, которые необходимо удалить.
  • Встроенная в админку библиотека jQuery обновлена ​​до версии 1.11.2.
  • Теперь вы можете указать AdminSite.site_url , чтобы отображалась ссылка на интерфейсный сайт.
  • Теперь вы можете указать, ModelAdmin.show_full_result_count следует ли отображать полное количество объектов на отфильтрованной странице администратора.
  • Теперь у AdminSite.password_change() метода есть extra_context параметр.
  • Теперь вы можете контролировать, кто может входить на сайт администратора, переопределив только AdminSite.has_permission() и AdminSite.login_form . В base.html шаблоне появился новый блок, usertools содержащий пользовательский заголовок. Новая переменная контекста has_permission , которая получает свое значение has_permission() , указывает, может ли пользователь получить доступ к сайту.
  • В раскрывающихся списках внешнего ключа теперь есть кнопки для изменения или удаления связанных объектов с помощью всплывающих окон.

django.contrib.admindocs

  • reStructuredText теперь анализируется в строках документации модели.

django.contrib.auth

  • Авторизация движки теперь может поднять PermissionDenied в has_perm() и has_module_perms() для проверки разрешения короткого замыкания.
  • PasswordResetForm теперь есть метод, send_mail() который можно переопределить, чтобы настроить отправляемую почту.
  • max_length Из Permission.name увеличено с 50 до 255 символов. Пожалуйста, запустите миграцию базы данных.
  • USERNAME_FIELD и REQUIRED_FIELDS теперь поддерживает ForeignKey s.
  • Количество итераций по умолчанию для хешера паролей PBKDF2 увеличено на 33%. Это изменение с обратной совместимостью не повлияет на пользователей, которые создали подклассы, django.contrib.auth.hashers.PBKDF2PasswordHasher чтобы изменить значение по умолчанию.

django.contrib.gis

  • Теперь доступен новый сериализатор GeoJSON .
  • Теперь можно, например, включить подзапрос в качестве аргумента географического поиска City.objects.filter(point__within=Country.objects.filter(continent='Africa').values('mpoly')) .
  • Серверная часть SpatiaLite теперь поддерживает Collect и Extent агрегирует, когда версия базы данных 3.0 или новее.
  • Команды инициализации PostGIS 2 и SpatiaLite теперь автоматически запускаются .CREATE EXTENSION postgis SELECT InitSpatialMetaData migrate
  • Интерфейс GDAL теперь поддерживает получение свойств файла растровых (изображений) данных .
  • Прокладки совместимости SpatialRefSys и GeometryColumns изменения в Django 1.2 были удалены.
  • Все исключения, связанные с GDAL, теперь вызываются с помощью GDALException . Первый OGRException был сохранен для обратной совместимости, но его больше не следует использовать.

django.contrib.sessions

  • Файл cookie сеанса теперь удаляется после flush() вызова.

django.contrib.sitemaps

  • Новый Sitemap.i18n атрибут позволяет вам создавать карту сайта на основе LANGUAGES настройки.

django.contrib.sites

  • get_current_site() теперь будет искать текущий сайт в зависимости от request.get_host() того, SITE_ID не задан ли параметр.
  • Значение по умолчанию, Site созданное при запуске, migrate теперь соответствует SITE_ID настройке (а не всегда pk=1 ).

Кэш

  • incr() Метод django.core.cache.backends.locmem.LocMemCache внутреннего интерфейса теперь потокобезопасный.

Криптография

Бэкэнды базы данных

  • Бэкэнд MySQL больше не удаляет микросекунды из datetime значений, поскольку MySQL 5.6.4 и выше поддерживает дробные секунды в зависимости от объявления поля datetime (когда DATETIME включает дробную точность больше 0). Новые столбцы базы данных datetime, созданные с помощью Django 1.8 и MySQL 5.6.4 и выше, будут поддерживать микросекунды. См. Примечания к базе данных MySQL для получения более подробной информации.
  • Серверная часть MySQL больше не создает явные индексы для внешних ключей при использовании механизма хранения InnoDB, поскольку MySQL уже создает их автоматически.
  • Серверная часть Oracle больше не определяет эту connection_persists_old_columns функцию как True . Вместо этого Oracle теперь будет включать пункт об очистке кеша при получении описания таблицы.

Электронная почта

Файловое хранилище

  • Storage.get_available_name() и Storage.save() теперь примите max_length аргумент для реализации ограничений максимальной длины имени файла на уровне хранилища. Имена файлов, превышающие этот аргумент, будут усечены. Это предотвращает ошибку базы данных при добавлении уникального суффикса к длинному имени файла, которое уже существует в хранилище. См. Примечание об устаревании о добавлении этого аргумента в пользовательские классы хранилища.

Формы

  • Виджеты форм теперь отображают атрибуты со значением True или False как логические атрибуты HTML5.
  • Новый has_error() метод позволяет проверить, не произошла ли конкретная ошибка.
  • Если required_css_class он определен в форме, то <label> теги для обязательных полей будут иметь этот класс в своих атрибутах.
  • Отрисовка неполевых ошибок в неупорядоченных списках ( <ul> ) теперь включает nonfield в свой список классов, чтобы отличать их от ошибок, специфичных для поля.
  • Field теперь принимает label_suffix аргумент, который переопределяет форму label_suffix . Это позволяет настраивать суффикс для каждого поля - ранее было невозможно переопределить форму label_suffix при использовании ярлыков, таких как шаблоны.{{ form.as_p }}
  • SelectDateWidget теперь принимает empty_label аргумент, который заменит метку выбора верхнего списка, когда DateField он не требуется.
  • После ImageField очистки и проверки UploadedFile объект будет иметь дополнительный image атрибут, содержащий Image экземпляр Pillow, используемый для проверки того, является ли файл допустимым изображением. Он также будет обновляться UploadedFile.content_type с учетом типа содержимого изображения, определенного Pillow.
  • Теперь вы можете передать вызываемый объект, который возвращает итерацию вариантов при создании экземпляра ChoiceField .

Общие представления

  • Общие представления, которые используют, MultipleObjectMixin теперь могут указывать порядок, применяемый к объекту, queryset путем установки ordering или переопределения get_ordering() .
  • Новый SingleObjectMixin.query_pk_and_slug атрибут позволяет изменить поведение get_object() так, чтобы он выполнял поиск с использованием как первичного ключа, так и слага.
  • Для этого get_form() метода больше не требуется form_class . Если не form_class указан, по умолчанию используется get_form_class() .
  • Заполнители ModelFormMixin.success_url теперь поддерживают str.format() синтаксис Python . Устаревший %(<foo>)s синтаксис по-прежнему поддерживается, но будет удален в Django 1.10.

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

  • FORMAT_MODULE_PATH теперь может быть списком строк, представляющих пути к модулям. Это позволяет импортировать несколько модулей формата из разных многоразовых приложений. Он также позволяет переопределить эти настраиваемые форматы в вашем основном проекте Django.

Ведение журнала

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

  • Соединения с базой данных теперь всегда закрываются после того, как команда управления, вызванная из командной строки, завершила свою работу.
  • Теперь также обнаружены команды из альтернативных форматов пакетов, таких как яйца.
  • Новая опция позволяет указать файл, в который записываются сериализованные данные.dumpdata --output
  • Новые и опции позволяют исключить конкретные локали от обработки.makemessages --exclude compilemessages --exclude
  • compilemessages теперь есть опция --use-fuzzy или, -f которая включает нечеткие переводы в скомпилированные файлы.
  • Вариант теперь игнорирует данные , которые больше не существуют модели.loaddata --ignorenonexistent
  • runserver теперь использует потоки демонов для более быстрой перезагрузки.
  • inspectdb теперь выводит Meta.unique_together . Он также может анализировать AutoField базы данных MySQL и PostgreSQL.
  • При вызове команд управления с использованием call_command() параметров имя параметра может совпадать с именем параметра командной строки (без начальных дефисов) или с конечным именем целевой переменной параметра, но в любом случае результирующий параметр, полученный командой, теперь всегда является dest указанным именем в определении параметра команды (если команда использует argparse модуль).
  • Теперь dbshell команда поддерживает необязательную настройку центра сертификации SSL MySQL ( --ssl-ca ).
  • Новое позволяет дать миграции (-ам) собственное имя вместо сгенерированного.makemigrations --name
  • Теперь loaddata команда предотвращает повторную загрузку прибора. Если FIXTURE_DIRS содержит дубликаты или путь к каталогу фикстур по умолчанию ( app_name/fixtures ), возникает исключение.
  • Новая опция позволяет выйти с кодом ошибки, если миграции не созданы.makemigrations --exit
  • Новая showmigrations команда позволяет вывести список всех миграций и их зависимостей в проекте.

Промежуточное ПО

  • CommonMiddleware.response_redirect_class Атрибут позволяет настроить переадресацию , выпущенную ИМ.
  • Сообщение отладки будет записано в django.request регистратор, когда промежуточное ПО вызывает MiddlewareNotUsed исключение в DEBUG режиме.

Миграции

Модели

  • Django теперь регистрирует не более 9000 запросов connections.queries , чтобы предотвратить чрезмерное использование памяти длительными процессами в режиме отладки.
  • Теперь есть Meta опция модели, позволяющая определить a для всех реляционных полей модели.default related name
  • Модели комплектации и наборы запросов в разных версиях Django официально не поддерживаются (может работать, но нет никаких гарантий). Дополнительная переменная, определяющая текущую версию Django, теперь добавляется к состоянию маринования моделей и RuntimeWarning наборов запросов , и Django выдает a, когда эти объекты распакованы в версии, отличной от той, в которой они были маринованы.
  • Добавлено, Model.from_db() что Django использует всякий раз, когда объекты загружаются с помощью ORM. Метод позволяет настроить поведение загрузки модели.
  • extra(select={...}) теперь позволяет избежать буквальной %s последовательности с помощью %%s .
  • Пользовательские поисковые запросы теперь можно зарегистрировать с помощью шаблона декоратора.
  • Новый Transform.bilateral атрибут позволяет создавать двусторонние преобразования. Эти преобразования применяются к обоим lhs и rhs при использовании в выражении поиска, предоставляя возможности для более сложных поисков.
  • Специальные символы SQL (,%, _) теперь правильно экранируются, когда поиск по шаблону (например contains , startswith и т.д.) используется с F() выражением в правой части. В этих случаях экранирование выполняется базой данных, что может привести к довольно сложным запросам, включающим REPLACE вызовы вложенных функций.
  • Теперь вы можете обновлять экземпляры модели с помощью Model.refresh_from_db() .
  • Теперь вы можете получить набор отложенных полей для модели с помощью Model.get_deferred_fields() .
  • Поля модели default теперь используются, если для поля первичного ключа установлено значение None .

Сигналы

  • Исключения из возвращенных кортежей теперь имеют обратную трассировку, прикрепленную как атрибут.(receiver, exception) Signal.send_robust() __traceback__
  • К сигналу environ был добавлен аргумент, содержащий структуру среды WSGI из запроса request_started .
  • Теперь вы можете импортировать setting_changed() сигнал из, django.core.signals чтобы избежать загрузки django.test в нестестовых ситуациях. Сам Django больше не делает этого.

Фреймворк проверки системы

  • register теперь можно использовать как функцию.

Шаблоны

  • urlize теперь поддерживает ссылки только для домена, которые включают символы после домена верхнего уровня (например, djangoproject.com/ и djangoproject.com/download/ ).
  • urlize не лечит восклицательных знаков в конце домена или его строки запроса как часть URL (URL - адрес, например , в 'djangoproject.com! это djangoproject.com )
  • Добавлен locmem.Loader класс, загружающий шаблоны Django из словаря Python.
  • now Тег теперь может сохранять свой вывод в переменном контексте с обычным синтаксисом: .{% now 'j n Y' as varname %}

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

  • WSGIRequest теперь уважает пути, начинающиеся с // .
  • Теперь HttpRequest.build_absolute_uri() метод // правильно обрабатывает пути, начинающиеся с .
  • Если DEBUG есть True и запрос вызывает a SuspiciousOperation , ответ будет отображен с подробной страницей ошибки.
  • query_string Аргумент QueryDict теперь необязательно, по умолчанию None , так что заготовка QueryDict теперь может быть обработана с QueryDict() вместо QueryDict(None) или QueryDict('') .
  • В GET и POST атрибуты HttpRequest объекта теперь QueryDict S , а не словари, а FILES атрибут теперь MultiValueDict . Это приводит этот класс в соответствие с документацией и с WSGIRequest .
  • HttpResponse.charset Атрибут был добавлен.
  • WSGIRequestHandler теперь следует RFC при преобразовании URI в IRI, используя uri_to_iri() .
  • Теперь HttpRequest.get_full_path() метод правильно экранирует небезопасные символы из части пути унифицированного идентификатора ресурса (URI).
  • HttpResponse теперь реализует несколько дополнительных методов, например, getvalue() чтобы экземпляры можно было использовать как объекты потока.
  • Новый HttpResponse.setdefault() метод позволяет установить заголовок, если он еще не установлен.
  • Вы можете использовать новое FileResponse для потоковой передачи файлов.
  • condition() Декоратора для условной обработки вида теперь поддерживает If-unmodified-since заголовок.

Тесты

  • RequestFactory.trace() И Client.trace() методы были реализованы, что позволяет создавать TRACE запросы в ваших тестах.
  • count Аргумент был добавлен в assertTemplateUsed() . Это позволяет утверждать, что шаблон отображался определенное количество раз.
  • Новое assertJSONNotEqual() утверждение позволяет проверить, что два фрагмента JSON не равны.
  • В test команду добавлены параметры для сохранения тестовой базы данных ( --keepdb ), для запуска тестовых случаев в обратном порядке ( --reverse ) и для включения ведения журнала SQL для неудачных тестов ( --debug-sql ).
  • Добавлен resolver_match атрибут для проверки ответов клиентов.
  • Добавлено несколько параметров , которые позволяют настраивать параметры тест табличных для Oracle: DATAFILE , DATAFILE_TMP , DATAFILE_MAXSIZE и DATAFILE_TMP_MAXSIZE .
  • Теперь override_settings() декоратор может воздействовать на главный маршрутизатор в DATABASE_ROUTERS .
  • Добавлена ​​поддержка тестового клиента для загрузки файлов с файловыми объектами.
  • Общий кеш теперь используется при тестировании с базой данных SQLite в памяти при использовании Python 3.4+ и SQLite 3.7.13+. Это позволяет разделять базу данных между потоками.

Валидаторы

  • URLValidator теперь поддерживает адреса IPv6, домены Unicode и URL-адреса, содержащие данные аутентификации.

Обратно несовместимые изменения в 1.8

Предупреждение

В дополнение к изменениям, описанным в этом разделе, обязательно ознакомьтесь с планом прекращения поддержки всех функций, которые были удалены. Если вы не обновили свой код в течение срока прекращения поддержки для данной функции, ее удаление может показаться обратным несовместимым изменением.

При присвоении отношениям несохраненных объектов возникает ошибка

Заметка

Чтобы упростить использование моделей в памяти, это изменение было отменено в Django 1.8.4 и заменено проверкой во время model.save() . Например:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.save()
Traceback (most recent call last):
...
ValueError: save() prohibited to prevent data loss due to unsaved related object 'author'.

Аналогичная проверка присвоения обратным взаимно-однозначным отношениям была удалена в Django 1.8.5.

Назначение несохраненных объектов к ForeignKey , GenericForeignKey и в OneToOneField настоящее время поднимает ValueError .

Раньше присвоение несохраненного объекта игнорировалось. Например:

>>> book = Book.objects.create(name="Django")
>>> book.author = Author(name="John")
>>> book.author.save()
>>> book.save()

>>> Book.objects.get(name="Django")
>>> book.author
>>>

Теперь появится ошибка, чтобы предотвратить потерю данных:

>>> book.author = Author(name="john")
Traceback (most recent call last):
...
ValueError: Cannot assign "<Author: John>": "Author" instance isn't saved in the database.

Если вам требуется разрешить назначение несохраненных экземпляров (старое поведение) и вас не беспокоит возможность потери данных (например, вы никогда не сохраняете объекты в базе данных), вы можете отключить эту проверку с помощью ForeignKey.allow_unsaved_instance_assignment атрибута. (Этот атрибут был удален в 1.8.4, поскольку он больше не актуален.)

Команды управления, которые принимают только позиционные аргументы

Если вы написали настраиваемую команду управления, которая принимает только позиционные аргументы, и вы не указали args командную переменную, вы можете получить сообщение об ошибке, например , поскольку анализ переменных теперь основан на том, что неявно не принимает позиционные аргументы. Вы можете сделать свою команду обратно совместимой, просто установив переменную класса. Однако, если вам не нужно поддерживать совместимость со старыми версиями Django, лучше реализовать новый метод, как описано в разделе Написание пользовательских команд django-admin .Error: unrecognized arguments: ... argparse args add_arguments()

Пользовательские аргументы команды управления тестами через средство запуска тестов

test Изменился метод добавления настраиваемых аргументов в команду управления через средство запуска тестов. Раньше вы могли предоставить option_list переменную класса в средстве выполнения тестов для добавления дополнительных аргументов (а ля optparse ). Теперь, чтобы реализовать такое же поведение, вам нужно создать метод класса в средстве выполнения тестов и вызвать его для добавления любых настраиваемых аргументов, поскольку синтаксический анализатор теперь является экземпляром.add_arguments(cls, parser) parser.add_argument argparse.ArgumentParser

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

Имя поля длиннее, чем длина имени столбца, поддерживаемая базой данных, может вызвать проблемы. Например, в MySQL вы получите исключение при попытке создать столбец, а в PostgreSQL имя столбца усечено базой данных (вы можете увидеть предупреждение в журналах PostgreSQL).

Была введена проверка модели, чтобы лучше предупреждать пользователей об этом сценарии перед фактическим созданием таблиц базы данных.

Если у вас есть существующая модель, в которой эта проверка кажется ложноположительной, например, в PostgreSQL, где имя уже усекалось, просто используйте, db_column чтобы указать имя, которое используется.

Проверка также применяется к столбцам, созданным в неявной ManyToManyField.through модели. Если вы столкнетесь с проблемой там, используйте through для создания явной модели, а затем укажите db_column ее в столбцах по мере необходимости.

Поиск отношения запросов теперь проверяет типы объектов

При запросе поиска модели теперь проверяется, является ли переданный объект правильным типом, и выдается, ValueError если нет. Раньше Django не заботился о том, был ли объект правильного типа; он просто использовал атрибут связанного поля объекта (например id ) для поиска. Теперь возникает ошибка, чтобы предотвратить неправильный поиск:

>>> book = Book.objects.create(name="Django")
>>> book = Book.objects.filter(author=book)
Traceback (most recent call last):
...
ValueError: Cannot query "<Book: Django>": Must be "Author" instance.

По умолчанию EmailField.max_length увеличен до 254

Старый по умолчанию 75 символов max_length не мог хранить все возможные адреса электронной почты, соответствующие RFC3696 / 5321. Чтобы сохранить все возможные действующие адреса электронной почты, max_length размер был увеличен до 254 символов. Вам нужно будет создать и применить миграции базы данных для затронутых моделей (или добавить, max_length=75 если вы хотите сохранить длину в ваших текущих полях). Перенос для django.contrib.auth.models.User.email включен.

Поддержка версий PostgreSQL старше 9.0

Конец периода поддержки восходящего потока для PostgreSQL 8.4 был достигнут в июле 2014 года. Как следствие, Django 1.8 устанавливает 9.0 в качестве минимальной официально поддерживаемой версии PostgreSQL.

Это также включает отказ от поддержки PostGIS 1.3 и 1.4, поскольку эти версии не поддерживаются в версиях PostgreSQL позже 8.4.

Django теперь также требует использования Psycopg2 версии 2.4.5 или выше (или 2.5+, если вы хотите использовать django.contrib.postgres ).

Поддержка версий MySQL старше 5.5

Конец периода поддержки восходящего потока был достигнут в январе 2012 г. для MySQL 5.0 и в декабре 2013 г. для MySQL 5.1. Как следствие, Django 1.8 устанавливает 5.5 как минимальную официально поддерживаемую версию MySQL.

Поддержка версий Oracle старше 11.1

Периоды восходящей поддержки истекли в июле 2010 г. для Oracle 9.2, в январе 2012 г. для Oracle 10.1 и в июле 2013 г. для Oracle 10.2. Как следствие, Django 1.8 устанавливает 11.1 как минимальную официально поддерживаемую версию Oracle.

Конкретные привилегии, используемые вместо ролей для тестов в Oracle

В более ранних версиях Django тестируемому пользователю Oracle предоставлялись роли CONNECT и RESOURCE. Эти роли устарели, поэтому Django 1.8 вместо них использует определенные базовые привилегии. Это изменяет привилегии, необходимые главному пользователю для запуска тестов (если проект не настроен так, чтобы не создавать тестового пользователя). Точные требуемые привилегии подробно описаны в примечаниях Oracle .

AbstractUser.last_login допускает нулевые значения

AbstractUser.last_login Поле теперь позволяет нулевые значения. Ранее по умолчанию использовалось время создания пользователя, что вводило в заблуждение, если пользователь никогда не входил в систему. Если вы используете пользователя по умолчанию ( django.contrib.auth.models.User ), запустите миграцию базы данных, включенную в contrib.auth .

Если вы используете настраиваемую модель пользователя, которая наследуется от AbstractUser , вам необходимо запустить makemigrations и сгенерировать миграцию для вашего приложения, содержащего эту модель. Кроме того , если хотите , чтобы набор last_login для NULL пользователей , которые не вошли в систему , вы можете запустить этот запрос:

from django.db import models
from django.contrib.auth import get_user_model
from django.contrib.auth.models import AbstractBaseUser

UserModel = get_user_model()
if issubclass(UserModel, AbstractBaseUser):
    UserModel._default_manager.filter(
        last_login=models.F('date_joined')
    ).update(last_login=None)

django.contrib.gis

  • Поддержка GEOS 3.1 и GDAL 1.6 прекращена.
  • Поддержка SpatiaLite <2.4 прекращена.
  • Поисковые запросы, специфичные для ГИС, были переработаны для использования django.db.models.Lookup API.
  • str Представление GEOSGeometry объектов по умолчанию было изменено с WKT на формат EWKT (включая SRID). Поскольку это представление используется в структуре сериализации, это означает, что dumpdata выходные данные теперь будут содержать значение SRID геометрических объектов.

Приоритет контекстных процессоров для TemplateResponse приведения в соответствие с render

TemplateResponse Конструктор предназначен , чтобы быть заменой для render() функции. Однако у него была небольшая несовместимость, поскольку для TemplateResponse контекстных данных из переданного в контекстном словаре могли быть затенены данные контекста, возвращенные из контекстных процессоров, тогда как для render этого было наоборот. Это была ошибка, и поведение render более подходящее, так как оно позволяет глобально определенным процессорам контекста быть локально переопределенными в представлении. Если вы полагались на данные контекста факта, которые TemplateResponse можно было бы переопределить с помощью обработчика контекста, вам нужно будет изменить свой код.

Переопределение setUpClass / tearDownClass в тестовых примерах ¶

Декораторы override_settings() и modify_settings() теперь действуют на уровне класса при использовании в качестве декораторов классов. Как следствие, при переопределении setUpClass() или tearDownClass() , то super реализация всегда должна быть вызвана.

Удаление django.contrib.formtools

Приложение formtools contrib было перемещено в отдельный пакет, а соответствующие страницы документации были обновлены или удалены.

Новый пакет доступен на GitHub и PyPI.

Перезагрузка соединения с базой данных между тестами

Django ранее закрыл соединения с базой данных между каждым тестом в TestCase . Это уже не так, поскольку Django теперь оборачивает TestCase транзакцию целиком . Если некоторые из ваших тестов основывались на старом поведении, вы должны TransactionTestCase вместо этого унаследовать их от .

Очистка django.template пространства имен

Если вы полагались на частные API, представленные в django.template модуле, возможно, вам придется импортировать их из django.template.base .

Также частные API - интерфейсы django.template.base.compile_string() , django.template.loader.find_template() и django.template.loader.get_template_from_string() были удалены.

model атрибут в частных модельных отношениях

В более ранних версиях Django в модели с обратной связью по внешнему ключу (например) model._meta.get_all_related_objects() возвращалась связь как django.db.models.related.RelatedObject с model атрибутом, установленным для источника связи. Теперь этот метод возвращает отношение как django.db.models.fields.related.ManyToOneRel (частный API RelatedObject был удален), и для model атрибута устанавливается цель отношения, а не источник. related_model Вместо этого исходная модель доступна по атрибуту.

Рассмотрим этот пример из учебника по Django 1.8:

>>> p = Poll.objects.get(pk=1)
>>> p._meta.get_all_related_objects()
[<ManyToOneRel: polls.choice>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Poll'>
>>> p._meta.get_all_related_objects()[0].related_model
<class 'polls.models.Choice'>

и сравните его с поведением в более старых версиях:

>>> p._meta.get_all_related_objects()
[<RelatedObject: polls:choice related to poll>]
>>> p._meta.get_all_related_objects()[0].model
<class 'polls.models.Choice'>

Чтобы получить доступ к исходной модели, вы можете использовать подобный шаблон для написания кода, который будет работать как с Django 1.8, так и с более ранними версиями:

for relation in opts.get_all_related_objects():
    to_model = getattr(relation, 'related_model', relation.model)

Также обратите внимание, что get_all_related_objects() это устарело в версии 1.8.

API серверной части базы данных

Следующие изменения в API серверной части базы данных задокументированы, чтобы помочь тем, кто пишет сторонние серверные части, обновить свой код:

  • BaseDatabaseXXX классы были перенесены в django.db.backends.base . Пожалуйста, импортируйте их из новых мест:

    from django.db.backends.base.base import BaseDatabaseWrapper
    from django.db.backends.base.client import BaseDatabaseClient
    from django.db.backends.base.creation import BaseDatabaseCreation
    from django.db.backends.base.features import BaseDatabaseFeatures
    from django.db.backends.base.introspection import BaseDatabaseIntrospection
    from django.db.backends.base.introspection import FieldInfo, TableInfo
    from django.db.backends.base.operations import BaseDatabaseOperations
    from django.db.backends.base.schema import BaseDatabaseSchemaEditor
    from django.db.backends.base.validation import BaseDatabaseValidation
    
  • data_types , data_types_suffix И data_type_check_constraints атрибуты переместились из DatabaseCreation класса в DatabaseWrapper .

  • Теперь SQLCompiler.as_sql() метод принимает subquery параметр ( # 24164 ).

  • Теперь BaseDatabaseOperations.date_interval_sql() метод принимает только timedelta параметр.

django.contrib.admin

  • AdminSite больше не принимает app_name аргумент, и его app_name атрибут был удален. Имя приложения всегда admin (в отличие от имени экземпляра, которое вы все еще можете настроить, используя AdminSite(name="...") .
  • ModelAdmin.get_object() Метод (частный API) принимает третий аргумент с именем from_field того , чтобы определить , какое поле должно соответствовать прилагаемому object_id .
  • Теперь ModelAdmin.response_delete() метод принимает второй аргумент с именем, obj_id который представляет собой сериализованный идентификатор, используемый для извлечения объекта перед удалением.

Автоматическое экранирование функций по умолчанию в django.template.defaultfilters

Чтобы встроенные фильтры шаблонов, выводящие HTML по умолчанию, были «безопасными по умолчанию» при их вызове в коде Python, следующие функции django.template.defaultfilters были изменены для автоматического экранирования входного значения:

  • join
  • linebreaksbr
  • linebreaks_filter
  • linenumbers
  • unordered_list
  • urlize
  • urlizetrunc

Вы можете вернуться к старому поведению, указав autoescape=False , передаете ли вы доверенный контент. Это изменение не влияет на использование соответствующих фильтров в шаблонах.

Разное

  • connections.queries теперь атрибут только для чтения.

  • Подключения к базе данных считаются равными, только если они являются одним и тем же объектом. Они больше не могут быть хешированы.

  • GZipMiddleware используется для отключения сжатия для некоторых типов содержимого, когда запрос поступает из Internet Explorer, чтобы обойти ошибку в IE6 и более ранних версиях. Такое поведение может повлиять на производительность IE7 и более поздних версий. Он был удален.

  • URLField.to_python больше не добавляет косую черту к URL без пути.

  • length Шаблон фильтра теперь возвращается 0 к неопределенной переменной, а не пустая строка.

  • ForeignKey.default_error_message['invalid'] был изменен с на Если вы используете это сообщение в своем собственном коде, обновите список интерполированных параметров. Внутри Django продолжит предоставлять параметр для обратной совместимости.'%(model)s instance with pk %(pk)r does not exist.' '%(model)s instance with %(field)s %(value)r does not exist.' pk params

  • UserCreationForm.error_messages['duplicate_username'] больше не используется. Если вы хотите настроить это сообщение об ошибке, переопределите его в форме, используя 'unique' ключ в Meta.error_messages['username'] или, если у вас есть настраиваемое поле формы для 'username' , используя 'unique' ключ в его error_messages аргументе.

  • Блок usertools в base.html шаблоне django.contrib.admin now требует установки has_permission переменной контекста. Если у вас есть какие-либо настраиваемые представления администратора, которые используют этот шаблон, обновите их, чтобы передать AdminSite.has_permission() как значение этой новой переменной, или просто включите AdminSite.each_context(request) в контекст.

  • В ClearableFileInput виджет были внесены внутренние изменения, позволяющие расширить возможности настройки. Недокументированный url_markup_template атрибут был удален в пользу template_with_initial .

  • Для согласованности с другими крупными поставщиками, в en_GB региональном стандарте теперь понедельник является первым днем ​​недели.

  • Секунды были удалены из всех районов , которые имели их TIME_FORMAT , DATETIME_FORMAT или SHORT_DATETIME_FORMAT .

  • По умолчанию максимальный размер тестового табличного пространства Oracle увеличился с 300 МБ (или 200 МБ, до версии 1.7.2) до 500 МБ.

  • reverse() и reverse_lazy() теперь возвращают строки Unicode вместо строк байтов.

  • CacheClass Прокладка была удалена из всех движков кэша. Эти псевдонимы были предоставлены для обратной совместимости с Django 1.3. Если вы все еще используете их, обновите свой проект, чтобы использовать настоящее имя класса, указанное в BACKEND ключе CACHES настройки.

  • По умолчанию call_command() теперь всегда пропускает фреймворк проверки (если вы его не пропустите skip_checks=False ).

  • При повторении строк File теперь использует универсальные символы новой строки . Следующие элементы считаются окончанием строки: соглашение'\n' оконце строки в Unix, соглашениеWindows '\r\n' и старое соглашение Macintosh'\r' .

  • Кеш-память Memcached находится в бэкэнде MemcachedCache и PyLibMCCache в случае set() неудачи удалит ключ . Это необходимо для того, чтобы cache_db хранилище сеансов всегда извлекало самые свежие данные сеанса.

  • Частные API override_template_loaders и override_with_test_loader в django.test.utils были удалены. Перекрыть TEMPLATES с override_settings вместо этого.

  • Предупреждения от серверной части базы данных MySQL больше не преобразуются в исключения, если DEBUG это так True .

  • HttpRequest теперь есть упрощенный repr (например ). Это не изменит поведения класса.<WSGIRequest: GET '/somepath/'> SafeExceptionReporterFilter

  • Класс на основе представления, использование ModelFormMixin возбудит ImproperlyConfigured исключение , когда оба fields и form_class атрибуты определены. Раньше fields игнорировалось.

  • При следовании перенаправлениям тестовый клиент теперь поднимается, RedirectCycleError если он обнаруживает цикл или достигает максимального предела перенаправления (вместо того, чтобы проходить тихо).

  • Переводимые строки, заданные в качестве default параметра поля, позже преобразуются в конкретные строки, поэтому Field.get_default() в некоторых случаях возвращаемый тип отличается. Нет никаких изменений в значениях по умолчанию, которые являются результатом callable.

  • GenericIPAddressField.empty_strings_allowed сейчас False . Бэкэнды базы данных, которые интерпретируют пустые строки как пустые (только Oracle среди бэкэндов, которые включает Django), больше не будут преобразовывать нулевые значения обратно в пустую строку. Это согласуется с другими бэкэндами.

  • Когда BaseCommand.leave_locale_alone атрибут равен False , переводы теперь деактивируются вместо принудительного использования локали «en-us». Если ваши модели содержат неанглийские строки, и вы рассчитываете, что переводы на английский язык будут активированы в командах управления, этого больше не будет. Может случиться так, что новые миграции базы данных генерируются (один раз) после перехода на 1.8.

  • django.utils.translation.get_language() теперь возвращается, None а не LANGUAGE_CODE когда переводы временно деактивированы.

  • Если для определенного литерала не существует перевода, резервный вариант теперь берется из LANGUAGE_CODE языка (а не из непереведенного msgid сообщения).

  • name Поле django.contrib.contenttypes.models.ContentType было удалено с помощью миграции и заменяется свойством. Это означает, что больше нельзя запрашивать или фильтровать ContentType по этому полю.

    Будьте осторожны, если вы обновитесь до Django 1.8 и пропустите Django 1.7. Если вы запустите , эта миграция будет пропущена, и вы увидите исключение, потому что столбец не будет удален из базы данных. Вместо этого используйте для имитации только первоначальной миграции.manage.py migrate --fake RuntimeError: Error creating new content types. name manage.py migrate --fake-initial

  • Новая опция позволяет имитировать начальные миграции. В версии 1.7 первоначальные миграции всегда автоматически подделывались, если все таблицы, созданные при первоначальной миграции, уже существовали.migrate --fake-initial

  • Приложение без миграции с a ForeignKey в приложение с миграциями теперь может привести к ошибке ограничения внешнего ключа при миграции базы данных или выполнении тестов. В Django 1.7 это могло произойти незаметно и привести к отсутствию ограничения. Чтобы устранить ошибку, добавьте в приложение миграции без них.

Функции, устаревшие в версии 1.8

Избранные методы в django.db.models.options.Options

В рамках формализации Model._meta API (из django.db.models.options.Options класса) ряд методов устарел и будет удален в Django 1.10:

  • get_all_field_names()
  • get_all_related_objects()
  • get_all_related_objects_with_model()
  • get_all_related_many_to_many_objects()
  • get_all_related_m2m_objects_with_model()
  • get_concrete_fields_with_model()
  • get_field_by_name()
  • get_fields_with_model()
  • get_m2m_with_model()

Загрузка тегов cycle и firstof шаблонов из future библиотеки

Django 1.6 введен и синтаксис для прямой совместимости и шаблонных тегов. Этот синтаксис устарел и будет удален в Django 1.10. Вы можете просто удалить теги.{% load cycle from future %} {% load firstof from future %} cycle firstof {% load ... from future %}

django.conf.urls.patterns()

В былые времена Django рекомендовали ссылаться на представления как на строки в urlpatterns :

urlpatterns = patterns('',
    url('^$', 'myapp.views.myview'),
)

а Django волшебным образом импортировал бы myapp.views.myview внутри себя и превратил бы строку в реальную ссылку на функцию. Чтобы уменьшить повторение при обращении ко многим представлениям из одного и того же модуля, patterns() функция принимает требуемый начальный prefix аргумент, который добавляется ко всем представлениям как строкам в этом наборе urlpatterns :

urlpatterns = patterns('myapp.views',
    url('^$', 'myview'),
    url('^other/$', 'otherview'),
)

В современную эпоху мы обновили руководство, чтобы вместо этого рекомендовать импортировать модуль представления и напрямую ссылаться на функции представления (или классы). У этого есть ряд преимуществ, все они проистекают из того факта, что мы используем обычный Python вместо «Django String Magic»: ошибки, возникающие при неправильном вводе имени представления, менее неясны, IDE могут помочь с автозаполнением имен представлений и т. Д.

Итак, в наши дни вышеупомянутое использование prefix arg с большей вероятностью будет записано (и лучше написано) как:

from myapp import views

urlpatterns = patterns('',
    url('^$', views.myview),
    url('^other/$', views.otherview),
)

Таким образом, patterns() не имеет смысла и является обузой при обучении новых пользователей (отвечая на вопрос новичка «зачем мне эта пустая строка в качестве первого аргумента patterns() ?»). По этим причинам мы не рекомендуем его. Обновить ваш код так же просто, как убедиться, что urlpatterns это список django.conf.urls.url() экземпляров. Например:

from django.conf.urls import url
from myapp import views

urlpatterns = [
    url('^$', views.myview),
    url('^other/$', views.otherview),
]

Передача строки в качестве view до django.conf.urls.url()

Как и в предыдущем пункте, ссылка на представления как на строки в url() функции устарела. Вместо этого передайте вызываемое представление, как описано в предыдущем разделе.

django.core.context_processors

Встроенные обработчики контекста шаблонов перемещены в django.template.context_processors .

django.test.SimpleTestCase.urls

Атрибут SimpleTestCase.urls для указания конфигурации URLconf в тестах устарел и будет удален в Django 1.10. @override_settings(ROOT_URLCONF=...) Вместо этого используйте .

prefix аргумент i18n_patterns()

Связанный с предыдущим элементом, prefix аргумент to django.conf.urls.i18n.i18n_patterns() устарел. django.conf.urls.url() Вместо этого просто передайте список экземпляров.

Использование неверного количества распакованных значений в for теге шаблона

Использование неправильного количества распакованных значений в for теге вызовет исключение, а не завершит работу в Django 1.10.

Передача пунктирного пути к reverse() и url

Обращение URL-адресов по пути Python - дорогостоящая операция, так как она приводит к импорту обратного пути. Такое поведение также привело к проблеме безопасности . Вместо этого используйте именованные шаблоны URL-адресов для реверсирования.

Если вы используете django.contrib.sitemaps , добавьте name аргумент к url этим ссылкам django.contrib.sitemaps.views.sitemap() :

from django.contrib.sitemaps.views import sitemap

url(r'^sitemap\.xml$', sitemap, {'sitemaps': sitemaps},
    name='django.contrib.sitemaps.views.sitemap')

для обеспечения совместимости при обращении по пути Python удален в Django 1.10.

Аналогично для карт сайта ГИС добавьте name='django.contrib.gis.sitemaps.views.kml' или name='django.contrib.gis.sitemaps.views.kmz' .

Если вы используете путь Python для параметра LOGIN_URL или LOGIN_REDIRECT_URL , используйте url() вместо него имя.

Агрегатные методы и модули

В django.db.models.sql.aggregates и django.contrib.gis.db.models.sql.aggregates модули (как частные API), устарели , как django.db.models.aggregates и django.contrib.gis.db.models.aggregates в настоящее время также отвечает за генерацию SQL. Старые модули будут удалены в Django 1.10.

Если вы использовали старые модули, ознакомьтесь с инструкциями по переписыванию пользовательских агрегатов с помощью нового стабильного API в разделе « Выражения запроса» .

Следующие методы и свойства django.db.models.sql.query.Query также устарели, а прокладки обратной совместимости будут удалены в Django 1.10:

  • Query.aggregates , заменено на annotations .
  • Query.aggregate_select , заменено на annotation_select .
  • Query.add_aggregate() , заменено на add_annotation() .
  • Query.set_aggregate_mask() , заменено на set_annotation_mask() .
  • Query.append_aggregate_mask() , заменено на append_annotation_mask() .

Расширение аргументов команды управления с помощью Command.option_list

Команды управления теперь используются argparse вместо optparse анализа аргументов командной строки, переданных командам. Это также означает, что способ добавления настраиваемых аргументов к командам изменился: вместо расширения option_list списка классов теперь следует переопределить add_arguments() метод и добавить аргументы через argparse.add_argument() . См. Этот пример для более подробной информации.

django.core.management.NoArgsCommand

Этот класс NoArgsCommand устарел и будет удален в Django 1.10. Используйте BaseCommand вместо этого, который по умолчанию не принимает аргументов.

Список всех миграций в проекте

--list Вариант из migrate команды управления является устаревшим и будет удален в Django 1.10. showmigrations Вместо этого используйте .

cache_choices вариант ModelChoiceField и ModelMultipleChoiceField

ModelChoiceField и ModelMultipleChoiceField выбрал недокументированный, непроверенный вариант cache_choices . Этот кешированный набор запросов между несколькими отрисовками одного и того же Form объекта. Эта опция подлежит ускоренной отмене и будет удалена в Django 1.9.

django.template.resolve_variable()

Функция была неофициально отмечена как «Устаревшая» в течение некоторого времени. Заменить на .resolve_variable(path, context) django.template.Variable(path).resolve(context)

django.contrib.webdesign

Он предоставил lorem тег шаблона, который теперь включен во встроенные теги. Просто удалите 'django.contrib.webdesign' из INSTALLED_APPS и от ваших шаблонов.{% load webdesign %}

error_message аргумент django.forms.RegexField

Он обеспечивал обратную совместимость для кода до версии 1.0, но его функциональность избыточна. Field.error_messages['invalid'] Вместо этого используйте .

Старый unordered_list синтаксис

Более старый (до 1.0), более строгий и подробный формат ввода для unordered_list фильтра шаблона объявлен устаревшим:

['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]

Используя новый синтаксис, это становится:

['States', ['Kansas', ['Lawrence', 'Topeka'], 'Illinois']]

django.forms.Field._has_changed()

Переименуйте этот метод в has_changed() , удалив ведущий символ подчеркивания. Старое имя будет работать до Django 1.10.

django.utils.html.remove_tags() и removetags шаблонный фильтр

django.utils.html.remove_tags() а также шаблонный фильтр removetags устарели, поскольку они не могут гарантировать безопасный вывод. Их существование, вероятно, приведет к их использованию в контекстах, чувствительных к безопасности, где они на самом деле небезопасны.

Неиспользуемая и недокументированная django.utils.html.strip_entities() функция также устарела.

is_admin_site аргумент django.contrib.auth.views.password_reset()

Это устаревший вариант, в котором больше нет необходимости.

SubfieldBase

django.db.models.fields.subclassing.SubfieldBase устарела и будет удалена в Django 1.10. Исторически он использовался для обработки полей, где требовалось преобразование типов при загрузке из базы данных, но не использовался в .values() вызовах или агрегатах. Он был заменен на from_db_value() .

Новый подход не вызывает to_python() метод при назначении, как это было в случае с SubfieldBase . Если вам нужно такое поведение, переопределите Creator класс из исходного кода Django в своем проекте.

django.utils.checksums

django.utils.checksums Модуль устарел и будет удален в Django 1.10. Предоставляемая им функция (проверка контрольной суммы с использованием алгоритма Луна) была недокументирована и не использовалась в Django. Модуль перемещен в пакет django-localflavor (версия 1.1+).

InlineAdminForm.original_content_type_id

original_content_type_id Атрибут InlineAdminForm устарел и будет удален в Django 1.10. Исторически он использовался для создания URL «просмотра на сайте». Этот URL-адрес теперь доступен с помощью absolute_url атрибута формы.

django.views.generic.edit.FormMixin.get_form() «S form_class аргумент

FormMixin подклассы, которые переопределяют get_form() метод, должны обеспечивать значение по умолчанию для form_class аргумента, поскольку теперь оно необязательно.

Визуализация шаблоны загружаются get_template() с Context

В get_template() Django 1.8 тип возвращаемого значения изменился: вместо a django.template.Template он возвращает Template экземпляр, точный тип которого зависит от того, какой бэкэнд его загрузил.

Оба класса предоставляют render() метод, однако первый принимает django.template.Context в качестве аргумента, а второй ожидает dict . Это изменение осуществляется путем прекращения поддержки шаблонов Django.

Все это относится и к select_template() .

Template и Context классы в шаблонах ответов

Некоторые методы SimpleTemplateResponse и TemplateResponse принимают django.template.Context и django.template.Template объекты в качестве аргументов. Теперь они должны получать dict объекты шаблонов, зависящие от серверной части, соответственно.

Это также относится к возвращаемым типам, если вы создали подкласс любого из классов ответа шаблона.

Дополнительную информацию см. В документации API ответа шаблона .

dictionary и context_instance аргументы функций рендеринга

Следующие функции больше не будут принять dictionary и context_instance параметры в Django 1.10:

  • django.shortcuts.render()
  • django.shortcuts.render_to_response()
  • django.template.loader.render_to_string()

context Вместо этого используйте параметр. Когда dictionary передается как позиционный аргумент, что является наиболее распространенной идиомой, никаких изменений не требуется.

Если вы передаете Context в систему context_instance , передайте dict в context параметре вместо этого. Если вы передаете RequestContext , передайте запрос отдельно в request параметре.

dirs аргумент функций поиска шаблона

Следующие функции больше не будут принимать dirs параметр для переопределения TEMPLATE_DIRS в Django 1.10:

Параметр не работал одинаково для разных загрузчиков шаблонов и не работал для включенных шаблонов.

django.template.loader.BaseLoader

django.template.loader.BaseLoader был переименован в django.template.loaders.base.Loader . Если вы написали собственный загрузчик шаблонов, который наследует BaseLoader , вы должны Loader вместо этого наследовать .

django.test.utils.TestTemplateLoader

Частный API django.test.utils.TestTemplateLoader устарел django.template.loaders.locmem.Loader и будет удален в Django 1.9.

Поддержка max_length аргумента о пользовательских Storage классах

Storage подклассы должны добавить max_length=None в качестве параметра get_available_name() и / или save() если они переопределяют любой метод. Поддержка хранилищ, которые не принимают этот аргумент, будет удалена в Django 1.10.

qn заменено на compiler

В предыдущих версиях Django различные внутренние методы ORM (в основном as_sql методы) принимали qn аргумент (для «имени цитаты»), который был ссылкой на функцию, которая цитировала идентификаторы для отправки в базу данных. В Django 1.8 этот аргумент был переименован в compiler и теперь является полным SQLCompiler экземпляром. Для обеспечения обратной совместимости при вызове SQLCompiler экземпляра выполняется то же цитирование имени, что и для qn функции. Однако эта прокладка обратной совместимости немедленно устарела: вы должны переименовать свои qn аргументы в compiler и вызвать то место, которое compiler.quote_name_unless_alias(...) вы вызывали ранее qn(...) .

Значение по умолчанию RedirectView.permanent

Значение RedirectView.permanent атрибута по умолчанию изменится с True на False в Django 1.9.

Использование AuthenticationMiddleware без SessionAuthenticationMiddleware

django.contrib.auth.middleware.SessionAuthenticationMiddleware был добавлен в Django 1.7. В Django 1.7.2 его функциональность была перенесена auth.get_user() и, для обратной совместимости, включалась, только если она 'django.contrib.auth.middleware.SessionAuthenticationMiddleware' появилась в MIDDLEWARE_CLASSES .

В Django 1.10 проверка сеанса будет включена независимо от того SessionAuthenticationMiddleware , включена она или нет (в этот момент не SessionAuthenticationMiddleware будет иметь значения). Вы можете добавить его в свое время MIDDLEWARE_CLASSES до этого, чтобы зарегистрироваться. Пожалуйста, прочтите сначала рекомендации по обновлению .

django.contrib.sitemaps.FlatPageSitemap

django.contrib.sitemaps.FlatPageSitemap переехал в django.contrib.flatpages.sitemaps.FlatPageSitemap . Старое местоположение импорта устарело и будет удалено в Django 1.9.

ssi тег шаблона

ssi Шаблонный тег позволяет файлы , которые будут включены в шаблон по абсолютному пути. Это ограниченное использование в большинстве ситуаций развертывания, и include тег часто имеет больше смысла. Этот тег устарел и будет удален в Django 1.10.

= как оператор сравнения в if теге шаблона

Использование единственного знака равенства с тегом шаблона для проверки на равенство было недокументировано и непроверено. Теперь он устарел и заменен на .{% if %} ==

%(<foo>)s синтаксис в ModelFormMixin.success_url

Устаревший %(<foo>)s синтаксис ModelFormMixin.success_url устарел и будет удален в Django 1.10.

GeoQuerySet агрегированные методы

collect() , extent() , extent3d() , make_line() , И unionagg() совокупные методы устарели и должны быть заменены на их основе функциональных эквивалентов совокупности ( Collect , Extent , Extent3D , MakeLine , и Union ).

Подпись allow_migrate метода роутера

Сигнатура allow_migrate() метода маршрутизаторов баз данных изменена с на .allow_migrate(db, model) allow_migrate(db, app_label, model_name=None, **hints)

Когда model_name установлено, значение, которое ранее было задано через model позиционный аргумент, теперь может быть найдено внутри hints словаря под ключом 'model' .

После перехода к новой подписи маршрутизатора будет также называться по RunPython и RunSQL операциям.

Функции, удаленные в 1.8

Эти функции достигли конца цикла устаревания и удалены в Django 1.8. Подробные сведения см. В разделе « Функции, не рекомендуемые в версии 1.6» , в том числе о том, как отказаться от использования этих функций.

  • django.contrib.comments устранен.
  • Следующие API управления транзакциями удалены:
    • TransactionMiddleware
    • декораторы и контекстные менеджеры autocommit , commit_on_success и commit_manually , определенные вdjango.db.transaction
    • функции commit_unless_managed и rollback_unless_managed , также определенные вdjango.db.transaction
    • TRANSACTIONS_MANAGED установка
  • В cycle и firstof теги шаблонов автоматически избежать их аргументы.
  • SEND_BROKEN_LINK_EMAILS Установка удаляется.
  • django.middleware.doc.XViewMiddleware устранен.
  • Model._meta.module_name Псевдоним удаляется.
  • Совместимые с обратной совместимостью прокладки, введенные для переименования get_query_set и аналогичных методов набора запросов, удалены. Это влияет на следующие классы: BaseModelAdmin , ChangeList , BaseCommentNode , GenericForeignKey , Manager , SingleRelatedObjectDescriptor и ReverseSingleRelatedObjectDescriptor .
  • Прокладки обратной совместимости введены для переименования атрибутов ChangeList.root_query_set и ChangeList.query_set удалены.
  • django.views.defaults.shortcut и django.conf.urls.shortcut удаляются.
  • Поддержка модуля Python Imaging Library (PIL) удалена.
  • Удаляются следующие частные API:
    • django.db.backend
    • django.db.close_connection()
    • django.db.backends.creation.BaseDatabaseCreation.set_autocommit()
    • django.db.transaction.is_managed()
    • django.db.transaction.managed()
  • django.forms.widgets.RadioInput устранен.
  • Модуль django.test.simple и класс django.test.simple.DjangoTestSuiteRunner удалены.
  • Модуль django.test._doctest удален.
  • CACHE_MIDDLEWARE_ANONYMOUS_ONLY Установка удаляется. Это изменение влияет как django.middleware.cache.CacheMiddleware и , django.middleware.cache.UpdateCacheMiddleware несмотря на отсутствие предупреждения устаревания в последнем классе.
  • Использование жестко запрограммированной клавиши Удерживайте нажатой «Control» или «Command» на Mac, чтобы выбрать более одного. строка для переопределения или добавления к предоставленной пользователем help_text в формах для ManyToMany полей модели больше не выполняется Django ни на уровне модели, ни на уровне форм.
  • Эти Model._meta.get_(add|change|delete)_permission методы не будут удалены.
  • Ключ сеанса django_language больше не читается для обратной совместимости.
  • Географические файлы Sitemap удалены ( django.contrib.gis.sitemaps.views.index и django.contrib.gis.sitemaps.views.sitemap ).
  • django.utils.html.fix_ampersands , fix_ampersands фильтр шаблона и django.utils.html.clean_html удаляются.

Copyright ©2021 All rights reserved