Django: Один url для нескольких параметров

Я пытаюсь реализовать url, который может обрабатывать несколько параметров. Например:

  • если я хочу получить проект с идентификатором 1 => project/1

    .
  • если я хочу получить проект с идентификатором 2 => project/2

  • если я хочу получить проект с id 1 и 2 => project/1/2

  • если я хочу получить проект с id 1, 2 и 3 => project/1/2/3

Есть ли способ реализовать эту логику без жесткого кодирования N адресов для N возможностей?

Вы можете сделать это следующим образом:

re_path(r'^project/(?P<id_list>[1-9][0-9]*(?:/[1-9][0-9]+)*)$', your_view),

и затем в представлении снова разделите список id:

ids = id_list.split('/')

Вы можете иметь несколько URLS, используя вменяемое представление, и после запуска представления они могут опрашивать свои собственные kwargs.

path('project/<first:int>/<second:int>/<third:int/', MyView.as_view(), name='project_3args'),
path('project/<first:int>/<second:int>/', MyView.as_view(), name='project_2args'),
path('project/<first:int>/', MyView.as_view(), name='project_1arg'),

(Порядок может иметь значение, поставьте самый длинный первым. Никогда так не делал)

В представлении что-то вроде

third = self.kwargs.get('third', None)
if third:
    # process 3-arg form

Для каждого количества аргументов нужен один url.

Альтернативно, нет ничего плохого в использовании Болдевином re_path, если вам нужен только один аргумент, который представляет собой список, разделенный косой чертой, без (небольшого) ограничения на количество элементов.

Наконец, есть еще request.GET, если вы решите использовать что-то вроде

/project_foo/?item=1&item=47&item=97

request.Get.getlist('item') вернет ['1','47','97']. GET Querystrings являются наиболее общими, так как абсолютно все может быть предоставлено в виде кусочков.

Вернуться на верх