Шаблон URL-адреса с произвольным количеством необязательных параметров
Чтобы отразить выбранные пользователем фильтры в URL-адресе, мне нужно urlpatterns
включить произвольное количество необязательных параметров, например:
/myview/filter1:option1/filter1:option2/filter2:option1/filter3:option5/
В представлении я бы сделал что-то вроде:
def myview(request):
if request.GET.get("filter1"):
for option in request.GET.get("filter1"):
# do something with option
if request.GET.get("filter2"):
for option in request.GET.get("filter2"):
# do something with option
# etc.
Каждый выбранный пользователем фильтр может (потенциально, в зависимости от типа фильтра) иметь несколько выбранных параметров, и несколько фильтров могут быть применены одновременно. Смотрите Мобильные игры в качестве примера того, что именно я имею в виду.
Если это невозможно с помощью urlpatterns Django, в качестве альтернативы параметры могут быть разделены разделителем, и в представлении я мог бы добавить, например request.GET.get("filter1").split(";")
.
Я полагаю, что для достижения этой цели мне нужно regex
, но я действительно не знаю, с чего начать. Я прочитал соответствующие документы, но не нашел ничего, что напрямую касалось бы такого рода шаблонов.
Ответ в Make Django accept url with infinite parameters совершенно правильный и в вашем случае будет выглядеть примерно так, как показано ниже:
url(r'^myview/(?P<path>[a-zA-Z\/]*)/$', myview),
def myview(request, path):
filters = path.split('/')
filterdict = dict()
for item in filters:
try:
key, val = item.split(':'):
filterdict[key] = value
except e as Exceptiion:
.... # Handle malformed urls here.
Что происходит в приведенном выше регулярном выражении, так это то, что оно захватывает все после "myview/" до закрывающего "/" в URL-адресе. В регулярном выражении символ "^" обозначает начало строки, поэтому в регулярном выражении указано, что оно должно начинаться с "myview/", а "$" обозначает конец строки, поэтому это означает, что оно должно заканчиваться на "/". Все ваши фильтры, включая косые черты, которые разделяют их между "myview/" и конечным "/" в url-пути, попадают в группу захвата пути, а затем вы добавляете их в свой список фильтров в функции.
Конечно, вы должны справляться с ситуациями, когда URL-адрес неправильно сформирован, с надлежащей обработкой исключений и следить за любыми хитростями, которые могут возникнуть при ручном вводе URL-адресов, и за тем, как вы справляетесь с этими фильтрами.
И, как всегда, пожалуйста, помните, что пути к URL-адресам и параметры запроса вводятся пользователем, поэтому будьте осторожны с указанными значениями и не используйте их небезопасными способами, когда они напрямую взаимодействуют без проверки работоспособности внутренних данных или хоста (например, не запускайте os.system() или os.popen() использует фильтры / значения, поскольку это может вызвать некоторые неприятные проблемы с безопасностью.)