Я пытаюсь создать собственный конвертер путей для анализа URL-адресов следующего типа:

http://127.0.0.1:8000/archives/tvseries/129/delete-image/352,353,354/ 

Чтобы извлечь список целых чисел, разделенных запятыми, из последней части URL-адреса /352,353,354/ и использовать его в представлении в self.kwargs.

Моя конфигурация URL:

register_converter(archives.converters.CommaSeparatedIntegersPathConverter, 'int_list')

urlpatterns = [
    path(
        'tvseries/<int:series_pk>/upload-image/<str:filename>/',
        archives.views.FileUploadView.as_view(),
        name='upload'
    ),
    path(
        'tvseries/<int:series_pk>/delete-image/<int_list:image_pk>/',
        archives.views.FileUploadView.as_view(),
        name='delete-image'
    ),
]

Конвертер в converters.py

class CommaSeparatedIntegersPathConverter:

    regex = '^(\d+(,\d+)*)?$'

    def to_python(self, value):
        return [int(v) for v in value.split(',')]

    def to_url(self, value):
        return ','.join(map(str, value))

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

Что не так?

1
Aleksei Khatkevich 14 Июн 2020 в 13:37

1 ответ

Лучший ответ

Вы можете использовать

regex = r'(?<=/)\d+(?:,\d+)*(?=/?$)'

См. демонстрацию регулярных выражений.

Регулярное выражение означает:

  • (?<=/) - соответствует местоположению, которому непосредственно предшествует символ /
  • \d+(?:,\d+)* - 1+ цифр, а затем 0 или более вхождений запятой и 1+ цифр
  • (?=/?$) - сразу справа должен быть необязательный /, а затем конец строки.
2
Wiktor Stribiżew 14 Июн 2020 в 10:52