Как сопоставить символ вопроса в URL-адресе Django?

В моем приложении Django у меня есть URL-адрес, который я хотел бы сопоставить, который выглядит примерно так:

/mydjangoapp/?parameter1=hello&parameter2=world

Проблема здесь - это?? символ является зарезервированным символом регулярного выражения.

Я пробовал несколько способов сопоставить это... Это была моя первая попытка:

(r'^pbanalytics/log/\?parameter1=(?P<parameter1>[\w0-9-]+)&parameter2=(?P<parameter2>[\w0-9-]+), 'mydjangoapp.myFunction')

Это была моя вторая попытка:

(r'^pbanalytics/log/\\?parameter1=(?P<parameter1>[\w0-9-]+)&parameter2=(?P<parameter2>[\w0-9-]+), 'mydjangoapp.myFunction')

но все равно не повезло!

Кто-нибудь знает, как я могу сопоставить '?' точно в URL-адрес Django?

Ответы

Ответ 1

не делать. Вы не должны сопоставлять строку запроса с диспетчером URL. Вы можете получить доступ ко всем значениям с помощью словаря request.GET.

URLs

(r'^pbanalytics/log/$', 'mydjangoapp.myFunction')

функция

def myFunction(request) 
  param1 = request.GET.get('param1')

Ответ 2

Шаблоны URL Django соответствуют только компоненту пути URL. Вы также пытаетесь найти ответ на запрос, поэтому у вас проблемы. Ваше первое регулярное выражение делает то, что вы хотели, за исключением того, что вы всегда должны соответствовать компоненту пути.

В вашем представлении вы можете получить доступ к querystring с помощью request.GET

Ответ 3

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

Однако ? в URL также является концом пути и началом query (например: protocol://host/path/?query#hash. Диспетчер URL-адресов Django не позволяет отправлять URL-адреса на основе части запроса AFAIK.

Мое предложение должно было бы написать представление django, которое выполняет диспетчеризацию на основе параметра request.GET для вашей функции просмотра.

Ответ 4

Способ сделать то, что исходный вопрос был, то есть catch-all в URL dispatch var...

url(r'^mens/(?P<pl_slug>.+)/$', 'main.views.mens',),

или

url(r'^mens/(?P<pl_slug>\?+)/$', 'main.views.mens',),

Насколько это необходимо, GET-URL точно не предоставляет хорошие "постоянные ссылки" или хорошую презентацию в целом для клиентов и клиентов.

Клиенты часто запрашивают, чтобы URL-адрес был отформатирован i.e.

www.example-clothing-site.com/mens/tops/shirts/t-shirts/Big_Brown_Shirt3XL

это гораздо более читаемый интерфейс для конечного пользователя и обеспечивает лучшую общую презентацию для клиента.