Регулярное выражение Urlpattern не работает

Я пытаюсь сделать url следующим образом

re_path(r'^product_list/(?P<category_slug>[\w-]+)/(?:(?P<filters>[\w~@=]+)?)$', views.ProductListView.as_view(), name='filtered_product_list'),

и на данный момент он работает с такими вещами, как:

/product_list/sdasdadsad231/bruh=1~3~10@nobruh=1~4

bruh=1~3~10@nobruh=1~4 - это фильтры

но позже я хочу реализовать функцию поиска по словам

поэтому я хочу, чтобы он распознавал такие вещи, как

/product_list/sdasdadsad231/?filters=bruh-1~3~10&nobruh-1~4&search_for=athing

/product_list/sdasdadsad231/?filters=bruh-1~3~10&nobruh-1~4

>

/product_list/sdasdadsad231/?search_for=athing

/product_list/sdasdadsad231/

поэтому в разных ситуациях он будет получать фильтры и/или search_for или вообще ничего

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

^product_list/(?P<category_slug>[\w-]+)/(?:\??(?P<filters>[\w~@=&-]+)?)$

Regex demo

Если вы хотите сопоставить ведущие / из данных примера, вы можете добавить их в образец после ^

The part after the question mark is the query string [wiki] and does not belong to the path. Django will construct a QueryDict for this, and this will be available through request.GET [Django-doc]. Indeed, if the path is for example:

/product_list/sdasdadsad231/?filters=bruh-1~3~10&nobruh-1~4&search_for=athing

Тогда ?filters=bruh-1~3~10&nobruh-1~4&search_for=athing является не частью пути, и он будет обернут в request.GET в виде QueryDict, который выглядит следующим образом:

>>> QueryDict('filters=bruh-1~3~10&nobruh-1~4&search_for=athing')
<QueryDict: {'filters': ['bruh-1~3~10'], 'nobruh-1~4': [''], 'search_for': ['athing']}>

Таким образом, вы не можете захватить часть после (и включая) вопросительного знака, она уже удалена из пути при попытке сопоставления с определениями re_path(…) и path(…).

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