Evgenii Legotckoi
Evgenii Legotckoi4 декабря 2017 г. 15:41

Выпуск Django 2.0

Содержание
  1. 1. Примечания к выпуску
    1. 1. Совместимость с Python
    2. 2. Поддержка третьесторонних библиотек для старых версий Django
    3. 3. Что нового в Django 2.0?
      1. 1. Упрощенный синтаксис маршрутизации URL-адресов
      2. 2. Mobile-friendly contrib.admin
      3. 3. Window expressions
    4. 4. Минорный функционал
      1. 1. django.contrib.admin
      2. 2. django.contrib.auth
      3. 3. django.contrib.gis
      4. 4. django.contrib.postgres
      5. 5. django.contrib.sitemaps
      6. 6. Cache
      7. 7. File Storage
      8. 8. Forms
      9. 9. Generic Views
      10. 10. Management Commands
      11. 11. Migrations
      12. 12. Models
      13. 13. Pagination
      14. 14. Запросы и ответы
      15. 15. Templates
      16. 16. Tests
      17. 17. Validators
    5. 5. Изменения без обратной совместимости в 2.0
      1. 1. В некоторых местах удалена поддержка bytestrings
      2. 2. Database backend API
      3. 3. Отброшена поддержка Oracle 11.2
      4. 4. Уровень изоляции MySQL по умолчанию read committed
      5. 5. AbstractUser.last_name max_length увеличен до 150
      6. 6. QuerySet.reverse() и last() запрещены после slicing
      7. 7. Поля формы больше не принимают необязательные аргументы в качестве позиционных аргументов
      8. 8. call_command() проверяет параметры, которые она получает
      9. 9. Индексы больше не принимают позиционные аргументы
      10. 10. Ограничения внешнего ключа теперь включены в SQLite
    6. 6. Разное
    7. 7. Функционал, устаревший в версии 2.0
      1. 1. Контекстный аргумент Field.from_db_value() и Expression.convert_value()
    8. 8. Разное
    9. 9. Функционал, удаленный в версии 2.0

Команда Django анонсировала выпуск Django 2.0

Этот выпуск начинается с использования в Django свободной формы семантического управления версиями, но нет существенных изменений в обратной совместимости (за исключением того, что был удалён Python 2.7), что было ожидаемым в выпуске 2.0. Обновление должно быть таким же, как и для предыдущих выпусков.

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

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

Django 2.0 поддерживает следующие версии Python: 3.4, 3.5 и 3.6. Разработчики Django настоятельно рекомендуют именно эти версии и официально поддерживают только последнии версии данных версионных серий Python.

Django 1.11.x является последней версией, которая поддерживает Python 2.7

Django 2.0 станет последней версией с поддержкой Python 3.4. Если вы планируете развертывание Python 3.4 до конца срока службы для Django 2.0 (апрель 2019 года), то используйте Django 1.11 LTS (поддерживаемый до апреля 2020 года). Обратите внимание, однако, что конец поддержки Python 3.4 - конец марта 2019 года.

Поддержка третьесторонних библиотек для старых версий Django

После выпуска Django 2.0 Разработчики предлагают сторонним разработчикам приложений отказаться от поддержки всех версий Django до 1.11. В тоже время разработчики должны иметь возможность запускать тесты своего пакета с помощью python -Wd , чтобы отображались предупреждения об ошибках. После внесения исправлений для предупреждения об ошибке приложение должно быть совместимо с Django 2.0.


Что нового в Django 2.0?

Упрощенный синтаксис маршрутизации URL-адресов

Новая функция django.urls.path() позволяет упростить синтаксис url-адресов, и сделать его более читаемым. Например, этот пример из предыдущих выпусков Django:

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),

Может быть написан следующим образом

path('articles/<int:year>/', views.year_archive),

Новый синтаксис поддерживает тип принуждения параметров URL. В этом примере представление будет принимать аргумент ключевого слова year как целое число, а не как строку. Кроме того, URL-адреса не будут теперь так ограничены, поскольку year передаётся в качестве целочисленного значения, то, например, год 10000 теперь будет соответствовать, поскольку целые числа года не ограничены четырьмя цифрами, так как если бы они находились в регулярном выражении.

Функция django.conf.urls.url() из предыдущих версий теперь доступна как django.urls.re_path() . Старое местоположение остается для обратной совместимости. Старая функция django.conf.urls.include() теперь импортируется из django.urls , поэтому вы можете использовать её как from django.urls import include, path, re_path в ваших URL-адресах.

Mobile-friendly contrib.admin

Теперь панель администрирования поддерживает все основные мобильные устройства. Старые браузеры могут испытывать различные уровни деградации.

Window expressions

Новое выражение Window позволяет добавить OVER к запросам. Вы можете использовать функции окна и агрегатные функции в выражении.

Минорный функционал

django.contrib.admin

  • Новые ModelAdmin.autocomplete_fields аттрибут и метод ModelAdmin.get_autocomplete_fields() позволяют использовать Select2 поисковый виджет для ForeignKey и ManyToManyField .

django.contrib.auth

  • Счетчик итераций по умолчанию для шифровальщика пароля PBKDF2 увеличен с 36 000 до 100 000.

django.contrib.gis

  • Добавлена поддержка MySQL для функции AsGeoJSON , функции GeoHash , функции IsValid , поиска isvalid и поиска расстояний.
  • Добавлены функции Azimuth и LineLocatePoint , поддерживаемые PostGIS и SpatiaLite .
  • Любая GEOSGeometry , импортированная из GeoJSON , теперь имеет свой набор SRID .
  • Добавлен атрибут OSMWidget.default_zoom , чтобы настроить масштаб изображения по умолчанию.
  • Сделаны метаданные, читаемые и редактируемые на растрах через атрибуты метаданных, информации и метаданных.
  • Разрешено передавать параметры создания конкретного драйвера для объектов GDALRaster с помощью papsz_options .
  • Разрешено создавать объекты GDALRaster во внутренней виртуальной файловой системе GDAL . Теперь Rasters можно создавать и преобразовывать в двоичные данные в памяти.
  • Новый метод GDALBand.color_interp() возвращает интерпретацию цвета для полосы.

django.contrib.postgres

  • Новый distinct аргумент для ArrayAgg определяет, будут ли объединенные значения различными.
  • Новая функция базы данных RandomUUID возвращает UUID версии 4. Для этого требуется использование расширения pgcrypto PostgreSQL , которое можно активировать с помощью новой операции миграции CryptoExtension .
  • django.contrib.postgres.indexes.GinIndex теперь поддерживает параметры fastupdate и gin_pending_list_limit .
  • Новый класс GistIndex позволяет создавать индексы GiST в базе данных. В новой операции миграции BtreeGistExtension устанавливается расширение btree_gist , чтобы добавить поддержку классов операторов, которые не встроены.
  • inspectdb теперь может использовать JSONField и различные RangeFields ( django.contrib.postgres должен быть в INSTALLED_APPS ).

django.contrib.sitemaps

  • Добавлен аргумент ключевого слова protocol в конструктор GenericSitemap .

Cache

  • cache.set_many() теперь возвращает список ключей, которые не были вставлены. Для встроенных бэкендов неудачные вставки могут произойти только на memcached .

File Storage

  • File.open() может использоваться как менеджер контекста, например. с file.open() как f: .

Forms

  • Новые аргументы date_attrs и time_attrs для SplitDateTimeWidget и SplitHiddenDateTimeWidget позволяют указывать различные атрибуты HTML для подвиджетов DateInput и TimeInput (или скрытых).
  • Новый метод Form.errors.get_json_data() возвращает ошибки формы в качестве словаря, подходящего для включения в ответ JSON.

Generic Views

  • Новый атрибут ContextMixin.extra_context позволяет добавить контекст в View.as_view() .

Management Commands

  • inspectdb теперь переводит беззнаковые целые столбцы MySQL в PositiveIntegerField или PositiveSmallIntegerField .
  • Новая опция makemessages --add-location определяет формат комментария в файлах PO.
  • loaddata теперь может читать из stdin .
  • Новая опция diffsettings - output позволяет форматировать вывод в унифицированном формате diff .
  • В Oracle инспекция теперь может рассматривать AutoField , если столбец создан как столбец идентификатора.
  • В MySQL dbshell теперь поддерживает клиентские TLS-сертификаты.

Migrations

  • Новая опция squashmigrations --squashed-name позволяет именовать сжатую миграцию.

Models

  • Новая функция базы данных StrIndex находит начальный индекс строки внутри другой строки.
  • В Oracle, AutoField и BigAutoField теперь создаются как столбцы идентификации.
  • Новый параметр chunk_size QuerySet.iterator() управляет количеством строк, выбранных клиентом базы данных Python при потоковой передаче результатов из базы данных. Для баз данных, которые не поддерживают серверные курсоры, он контролирует количество результатов, полученных Django из адаптера базы данных.
  • QuerySet.earliest() , QuerySet.latest() и Meta.get_latest_by теперь позволяют упорядочивать несколько полей.
  • Добавлена функция ExtractQuarter для извлечения квартала из DateField и DateTimeField .
  • Добавлена функция TruncQuarter для обрезания DateField и DateTimeField в первый день квартала.
  • Добавлен параметр db_tablespace для индексов класса.
  • Если база данных поддерживает собственное поле продолжительности ( Oracle и PostgreSQL ), Extract теперь работает с DurationField .
  • Добавлен аргумент QuerySet.select_for_update(), поддерживаемый PostgreSQL и Oracle , для блокировки только строк из определенных таблиц, а не всех выбранных таблиц. Это может быть полезно, особенно если select_for_update() используется в сочетании с select_related() .
  • Новый параметр field_name QuerySet.in_bulk() позволяет получать результаты на основе любого уникального поля модели.
  • CursorWrapper.callproc() теперь использует необязательный словарь параметров ключевого слова, если бэкэнд поддерживает эту функцию. Встроенные серверы Django поддерживают только Oracle.
  • Новый метод connection.execute_wrapper() позволяет устанавливать обёртки вокруг выполнения запросов к базе данных.
  • Новый аргумент фильтра для встроенных агрегатов позволяет добавлять различные условные обозначения в несколько агрегатов по тем же полям или отношениям.
  • Добавлена поддержка выражений в Meta.ordering .
  • Новый именованный параметр QuerySet.values_list() позволяет получать результаты как именованные кортежи.
  • Новый класс FilteredRelation позволяет добавить ON к запросам.

Pagination

  • Добавлен Paginator.get_page() , чтобы обеспечить документированный шаблон обработки недопустимых номеров страниц.

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

  • Метод runserver для Веб-серверa  поддерживает HTTP 1.1.

Templates

  • Чтобы повысить полезность Engine.get_default() в сторонних приложениях, теперь он возвращает первый движок, если несколько механизмов DjangoTemplates сконфигурированы в TEMPLATES вместо того, чтобы выбрасывать NotperlyConfigured .
  • Пользовательские теги шаблонов теперь могут принимать аргументы только для ключевого слова.

Tests

  • Добавлена поддержка потоковой передачи LiveServerTestCase .
  • Добавлены настройки, которые позволяют настраивать параметры тестового табличного пространства для Oracle: DATAFILE_SIZE , DATAFILE_TMP_SIZE , DATAFILE_EXTSIZE и DATAFILE_TMP_EXTSIZE .

Validators

  • Новый ProhibitNullCharactersValidator запрещает нулевой символ во вводе поля формы CharField и его подклассов. Нулевой ввод символов наблюдался из инструментов сканирования уязвимостей. Большинство баз данных молча отбрасывают нулевые символы, но psycopg2 2.7+ создает исключение при попытке сохранить нулевой символ в поле char / text с PostgreSQL .

Изменения без обратной совместимости в 2.0

В некоторых местах удалена поддержка bytestrings

Чтобы поддерживать собственные строки Python 2, более старые версии Django должны были принимать как байты, так и строки unicode. Теперь, когда поддержка Python 2 отбрасывается, байты должны встречаться только вокруг границ ввода / вывода (например, обработка двоичных полей или потоков HTTP). Возможно, вам придется обновить свой код, чтобы ограничить использование байтов до минимума, поскольку Django больше не принимает байты в определенных кодах.

Например, reverse() теперь использует str() вместо force_text() для принуждения аргументов и kwargs , которые он получает, до их размещения в URL-адресе. Для байтов, это создает строку с нежелательным префиксом b, а также дополнительные кавычки (str (b'foo ') - «b'foo») . Чтобы адаптироваться, вызовите decode() в байтовой последовательности, прежде чем передавать его в reverse() .

Database backend API

В этом разделе описываются изменения, которые могут потребоваться в сторонних бэкэндах баз данных.

  • Методы DatabaseOperations.datetime_cast_date_sql() , datetime_cast_time_sql() , datetime_trunc_sql() , datetime_extract_sql() и date_interval_sql() теперь возвращают только SQL для выполнения операции вместо SQL и список параметров.
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseWrapper.display_name с именем базы данных, с которой работает ваш бэкэнд. Django может использовать его в различных сообщениях, например, в системных проверках.
  • Первый аргумент SchemaEditor._alter_column_type_sql() теперь является моделью, а не таблицей.
  • Первый аргумент SchemaEditor._create_index_name() теперь является table_name , а не моделью.
  • Чтобы включить FOR UPDATE поддержку, установите DatabaseFeatures.has_select_for_update_of = True . Если база данных требует, чтобы аргументы OF были столбцами, а не таблицами, установите DatabaseFeatures.select_for_update_of_column = True .
  • Чтобы включить поддержку выражений Window , установите для параметра DatabaseFeatures.supports_over_clause значение True . Возможно, вам придется настроить методы DatabaseOperations.window_start_rows_start_end() и / или window_start_range_start_end() .
  • Сторонние базы данных базы данных должны добавить атрибут DatabaseOperations.cast_char_field_without_max_length с типом данных базы данных, который будет использоваться в функции Cast для CharField , если аргумент max_length не указан.
  • Первый аргумент DatabaseCreation._clone_test_db() и get_test_db_clone_settings() теперь является суффиксом, а не числом (в случае, если вы хотите переименовать подписи в своем сервере для согласованности). Теперь django.test передает эти значения как строки, а не как целые числа.
  • Сторонние базы данных базы данных должны добавить метод DatabaseIntrospection.get_sequences() на основе заглушки в BaseDatabaseIntrospection .

Отброшена поддержка Oracle 11.2

Окончание поддержки по восходящей линии для Oracle 11.2 - декабрь 2020 года. Django 1.11 будет поддерживаться до апреля 2020 года, который почти достигнет этой даты. Django 2.0 официально поддерживает Oracle 12.1+.

Уровень изоляции MySQL по умолчанию read committed

Уровень изоляции MySQL по умолчанию, повторяемое чтение, может привести к потере данных при типичном использовании Django. Чтобы предотвратить это и для согласованности с другими базами данных, уровень изоляции по умолчанию теперь read committed. Вы можете использовать параметр DATABASES для использования другого уровня изоляции, если это необходимо.

AbstractUser.last_name max_length увеличен до 150

Включена миграция для django.contrib.auth.models.User.last_name. Если у вас есть пользовательская модель, наследующая от AbstractUser, вам необходимо создать и применить миграцию базы данных для вашей модели пользователя.

Если вы хотите сохранить ограничение на 30 символов для фамилий, используйте пользовательскую форму:

from django.contrib.auth.forms import UserChangeForm

class MyUserChangeForm(UserChangeForm):
    last_name = forms.CharField(max_length=30, required=False)

Если вы хотите сохранить это ограничение в админе при редактировании пользователей, установите UserAdmin.form для использования этой формы:

from django.contrib.auth.admin import UserAdmin
from django.contrib.auth.models import User

class MyUserAdmin(UserAdmin):
    form = MyUserChangeForm

admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)

QuerySet.reverse() и last() запрещены после slicing

Вызов QuerySet.reverse() или last() на фрагментированном наборе запросов приводит к неожиданным результатам из-за того, что срез применяется после переупорядочения. Это запрещено, например:

>>> Model.objects.all()[:2].reverse()
Traceback (most recent call last):
...
TypeError: Cannot reverse a query once a slice has been taken.

Поля формы больше не принимают необязательные аргументы в качестве позиционных аргументов

Чтобы предотвратить ошибки времени выполнения из-за неправильного упорядочения аргументов поля формы, необязательные аргументы встроенных полей формы больше не принимаются в качестве позиционных аргументов. Например:

forms.IntegerField(25, 10)

вызывает исключение и заменяется на:

forms.IntegerField(max_value=25, min_value=10)

call_command() проверяет параметры, которые она получает

Теперь call_command() проверяет, что парсер аргументов вызываемой команды определяет все параметры, переданные в call_command().

Для пользовательских команд управления, которые используют параметры, не созданные с помощью parser.add_argument() , добавьте в команду атрибут stealth_options :

class MyCommand(BaseCommand):
    stealth_options = ('option_name', ...)

Индексы больше не принимают позиционные аргументы

Например:

models.Index(['headline', '-pub_date'], 'index_name')

вызывает исключение и заменяется на:

models.Index(fields=['headline', '-pub_date'], name='index_name')

Ограничения внешнего ключа теперь включены в SQLite

Это будет отображаться как обратное-несовместимое изменение (ограничение целостности IntegrityError: FOREIGN KEY) при попытке сохранить существующий экземпляр модели, нарушающий ограничение внешнего ключа.

Внешние ключи теперь создаются с DEFERRABLE INITIALLY DEFERRED вместо DEFERRABLE IMMEDIATE. Таким образом, таблицы, возможно, потребуется перестроить для воссоздания внешних ключей с новым определением, особенно если вы используете такой шаблон:

from django.db import transaction

with transaction.atomic():
    Book.objects.create(author_id=1)
    Author.objects.create(id=1)

Если вы не воссоздаете внешний ключ как DEFERRED, первый create() завершится ошибкой, если будут применены ограничения внешнего ключа.

Сначала создайте резервную копию базы данных! После обновления до Django 2.0 вы можете перестроить таблицы, используя скрипт, подобный этому:

from django.apps import apps
from django.db import connection

for app in apps.get_app_configs():
    for model in app.get_models(include_auto_created=True):
        if model._meta.managed and not (model._meta.proxy or model._meta.swapped):
            for base in model.__bases__:
                if hasattr(base, '_meta'):
                    base._meta.local_many_to_many = []
            model._meta.local_many_to_many = []
            with connection.schema_editor() as editor:
                editor._remake_table(model)

Этот скрипт не получил широкого тестирования и нуждается в адаптации для различных случаев, таких как несколько баз данных. Не стесняйтесь вносить улучшения.

Кроме того, из-за ограничения на изменение таблицы SQLite запрещается выполнять операции RenameModel и RenameField для моделей или полей, на которые ссылаются другие модели в транзакции. Чтобы разрешить миграции, содержащие эти операции, вы должны установить для атрибута Migration.atomic значение False.

Разное

  • Класс SessionAuthenticationMiddleware удален. Он не обеспечивал функциональности, поскольку аутентификация сеанса безоговорочно включена в Django 1.10.
  • Обработчики ошибок HTTP по умолчанию (handler404 и т. Д.) Теперь являются вызывающими, а не пунктирными строками пути Python. Django поддерживает вызываемые ссылки, поскольку они обеспечивают лучшую производительность и возможность отладки.
  • RedirectView больше не отключает NoReverseMatch , если pattern_name не существует.
  • Когда USE_L10N выключен, FloatField и DecimalField теперь соблюдают DECIMAL_SEPARATOR и THOUSAND_SEPARATOR во время проверки. Например, с настройками, ввод «1.345» теперь преобразован в 1345 вместо 1.345.:
USE_L10N = False
USE_THOUSAND_SEPARATOR = True
DECIMAL_SEPARATOR = ','
THOUSAND_SEPARATOR = '.'
  • Подклассы AbstractBaseUser больше не требуются для реализации get_short_name() и get_full_name() . (Базовые реализации, которые поднимают NotImplementedError , удаляются.) Django.contrib.admin использует эти методы, если они реализованы, но не требуют их. Сторонние приложения, использующие эти методы, могут захотеть применить аналогичный подход.
  • Параметры формата FIRST_DAY_OF_WEEK и NUMBER_GROUPING теперь сохраняются как целые числа в выводах JavaScript и JSON i18n.
  • assertNumQueries() теперь игнорирует запросы конфигурации соединения. Раньше, если в тесте было открыто новое соединение с базой данных, эти запросы могли быть включены как часть countNumQueries() .
  • Размер по умолчанию тестового табличного пространства Oracle увеличивается с 20M до 50M, а размер автоэкстенда по умолчанию увеличивается с 10M до 25M.
  • Чтобы повысить производительность при потоковой передаче больших наборов результатов из базы данных, QuerySet.iterator() теперь извлекает 2000 строк за раз, а не 100. Старое поведение можно восстановить с помощью параметра chunk_size . Например:
Book.objects.iterator(chunk_size=100)
  • Предоставление неизвестных имен пакетов в аргументе пакетов в представлении JavaScriptCatalog теперь вызывает ValueError вместо молчания.
  • Первичный ключ экземпляра модели теперь появляется в методе модели . str () по умолчанию, например. Объект вопроса (1).
  • makemigrations теперь обнаруживает изменения в поле limit_choices_to параметра модели. Добавьте это в свои существующие миграции или примите автоматически сгенерированную миграцию для полей, которые ее используют.
  • Выполнение запросов, требующих автоматических пространственных преобразований, теперь вызывает NotImplementedError для MySQL вместо молчания с использованием не трансформированных геометрий.
  • django.core.exceptions.DjangoRuntimeWarning удаляется. Он использовался только в кеш-памяти в качестве промежуточного класса в наследовании CacheKeyWarning для RuntimeWarning .
  • Переименовано BaseExpression._output_field в поле output_field . Возможно, вам придется обновить пользовательские выражения.
  • В более старых версиях формы и формы объединяют свои медиа с виджетами Media, объединяя их. Объединение теперь пытается сохранить относительный порядок элементов в каждом списке. MediaOrderConflictWarning выдается, если заказ не может быть сохранен.
  • django.contrib.gis.gdal.OGRException удаляется. Это был псевдоним для GDALException с Django 1.8.
  • Поддержка GEOS 3.3.x отключена.
  • Способ выбора данных для GeometryField изменен для повышения производительности, а в необработанных SQL-запросах эти поля теперь должны быть завернуты в connection.ops.select .

Функционал, устаревший в версии 2.0

Контекстный аргумент Field.from_db_value() и Expression.convert_value()

Аргумент контекста Field.from_db_value() и Expression.convert_value() не используется, поскольку он всегда является пустым словарем. Сигнатура обоих методов теперь:

(self, value, expression, connection)

вместо:

(self, value, expression, connection, context)

Поддержка старой сигнатуры в пользовательских полях и выражениях сохраняется до Django 3.0.

Разное

  • Модуль django.db.backends.postgresql_psycopg2 устарел в пользу django.db.backends.postgresql . Это был псевдоним в Django 1.9. Это влияет только на код, который напрямую импортируется из модуля. Параметр DATABASES по-прежнему может использовать 'django.db.backends.postgresql_psycopg2' , хотя вы можете упростить это, используя имя 'django.db.backends.postgresql' , добавленное в Django 1.9.
  • django.shortcuts.render_to_response() устарел в пользу django.shortcuts.render() . render() принимает те же аргументы, за исключением того, что он также требует запроса.
  • Значение DEFAULT_CONTENT_TYPE устарело. Он не очень хорошо взаимодействует со сторонними приложениями и устарел, поскольку HTML5 в основном заменил XHTML .
  • HttpRequest.xreadlines() устарел в пользу итерации по запросу.
  • Аргумент ключевого слова field_name для QuerySet.earliest() и QuerySet.latest() устарел в пользу передачи имен полей в качестве аргументов. Напишите .earliest('pub_date') вместо .earliest(field_name = 'pub_date') .

Функционал, удаленный в версии 2.0

Также в Django 2.0 были удалены все функции, которые были помечены как устаревшие в версиях 1.9 и 1.10.

Для Django рекомендую VDS-сервера хостера Timeweb .

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

ПК
  • 2 марта 2018 г. 23:41

По поводу упрощённого синтаксиса машрутизации урлов. С тем что увеличивается читабельность и довольно удобно принуждение типов бесспорно. А вот пример с архивом по годам и утверждение, что регулярные выражения как то ограничивали количество цифр, неверно - количество символов ограничивает данный конкретный шаблон, если его переписать как

url(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive), 

то уже ничего не ограничивается. Да и как может функционал внутри построенный на регулярных выражениях быть более гибким чем регулярные выражения? Тут цель не переплюнуть регулярные выражения в функциональности, а добавить удобства и читабельности.

не отредактировал выражение. вот правильное

url(r'^articles/(?P<year>[0-9]+)/$', views.year_archive),
Evgenii Legotckoi
  • 3 марта 2018 г. 6:16

Это утверждение официальных разработчиков Django в release notes к данному выпуску.

Полагаю, что они хотели этим сказать, что не нужно забивать голову тем, чтобы придумывать регулярное выражение в том случае, когда нужно получить целочисленное значение в URL.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
e
  • ehot
  • 31 марта 2024 г. 21:29

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
B

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
B

C++ - Тест 001. Первая программа и типы данных

  • Результат:46баллов,
  • Очки рейтинга-6
Последние комментарии
k
kmssr9 февраля 2024 г. 2:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 9:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 16:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 5:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
a
a_vlasov14 апреля 2024 г. 13:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 9:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
Mm
Mind mingles12 апреля 2024 г. 7:42
ASO Service Forum: Enhancing App Visibility and Reach Welcome to the ASO Service Forum, your ultimate destination for insights, discussions, and strategies revolving around App Store Optimization. ASO (App Store Optimization) is paramoun…
f
fastrex4 апреля 2024 г. 11:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
P
Pisych27 февраля 2023 г. 12:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))

Следите за нами в социальных сетях