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 являются наиболее общими, так как абсолютно все может быть предоставлено в виде кусочков.