Тег URL-адреса шаблона Django с одним параметром для URL-адреса с группой захвата ORed завершается с ошибкой при обратном поиске

#django #django-templates

#django #django-templates

Вопрос:

Не лучший заголовок.. в любом случае: у меня есть следующая запись URLconf:

 url(r'^events(?:/(?:(?P<event_id>d )|(?P<new>new)))?/?

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

Например, скажем, я хочу пойти на:

 /events/1
 

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

 {% url 'social_network:events' event.id %}
 

И я получаю:

 Reverse for 'events' with arguments '(1,)' and keyword arguments '{}' not found. 1 pattern(s) tried: ['events(?:/(?:(?P<event_id>\d )|(?P<new>new)))?/?

Я также пытался с именованными параметрами (вместо event_id=1) передать параметры в словаре, но все та же ошибка. Имейте в виду, если я удалю одну из групп захвата ORed, тогда она разрешится просто отлично.

Есть мысли?


Ответ №1:

Django не может отменить URL-адреса с дополнительными группами захвата, потому что он не может знать, что туда поместить. Лучший способ справиться с этой ситуацией - иметь несколько записей в urlconf: одну для версии без параметров, одну с идентификатором и одну с new .

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

Комментарии:

1. Есть идеи, почему он не сможет выполнить обратный поиск? если он идет слева направо, он должен соответствовать первой группе, в которую он должен вставить event.id (предполагая, что ожидание / возврат назад или жадность), а затем сопоставьте $.

2. Однако, если я использую 3 разных URL-адреса, как мне отличить их при обращении к ним? Должен ли я назначать им разные параметры "name"? Например, url (regex1, EventView.ASView(), name='events.list'), url (regex2, EventView.ASView(), name ='events.new') и т. Д.?

3. И на самом деле, похоже, он способен обрабатывать необязательные группы. Если я сделаю это: url(r'^events(?:/(?P<event_id>d ))?/?$', EventView.as_view(), name='events') , это работает просто отлично. И это именованная группа захвата внутри необязательной группы удаления. Может быть, вы имели в виду группы ORed? Но, тем не менее, для меня это не совсем имеет смысл.

, EventView.as_view(), name='events')
Который, как вы можете видеть, не может принимать никаких дополнительных компонентов пути после событий, или числа, или слова "новый". Моя проблема заключается в попытке выполнить обратный поиск с одной из двух групп захвата из шаблона. Django, похоже, не понимает, что если тегу URL-адреса шаблона задан один аргумент, все в порядке, поскольку в моем регулярном выражении указано, что это либо одна группа, либо другая.

Например, скажем, я хочу пойти на:


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


И я получаю:


Я также пытался с именованными параметрами (вместо event_id=1) передать параметры в словаре, но все та же ошибка. Имейте в виду, если я удалю одну из групп захвата ORed, тогда она разрешится просто отлично.

Есть мысли?

Ответ №1:

Django не может отменить URL-адреса с дополнительными группами захвата, потому что он не может знать, что туда поместить. Лучший способ справиться с этой ситуацией - иметь несколько записей в urlconf: одну для версии без параметров, одну с идентификатором и одну с new .

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

Комментарии:

1. Есть идеи, почему он не сможет выполнить обратный поиск? если он идет слева направо, он должен соответствовать первой группе, в которую он должен вставить event.id (предполагая, что ожидание / возврат назад или жадность), а затем сопоставьте $.

2. Однако, если я использую 3 разных URL-адреса, как мне отличить их при обращении к ним? Должен ли я назначать им разные параметры "name"? Например, url (regex1, EventView.ASView(), name='events.list'), url (regex2, EventView.ASView(), name ='events.new') и т. Д.?

3. И на самом деле, похоже, он способен обрабатывать необязательные группы. Если я сделаю это: url(r'^events(?:/(?P<event_id>d ))?/?$', EventView.as_view(), name='events') , это работает просто отлично. И это именованная группа захвата внутри необязательной группы удаления. Может быть, вы имели в виду группы ORed? Но, тем не менее, для меня это не совсем имеет смысл.

]

Я также пытался с именованными параметрами (вместо event_id=1) передать параметры в словаре, но все та же ошибка. Имейте в виду, если я удалю одну из групп захвата ORed, тогда она разрешится просто отлично.

Есть мысли?

Ответ №1:

Django не может отменить URL-адреса с дополнительными группами захвата, потому что он не может знать, что туда поместить. Лучший способ справиться с этой ситуацией — иметь несколько записей в urlconf: одну для версии без параметров, одну с идентификатором и одну с new .

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

Комментарии:

1. Есть идеи, почему он не сможет выполнить обратный поиск? если он идет слева направо, он должен соответствовать первой группе, в которую он должен вставить event.id (предполагая, что ожидание / возврат назад или жадность), а затем сопоставьте $.

2. Однако, если я использую 3 разных URL-адреса, как мне отличить их при обращении к ним? Должен ли я назначать им разные параметры «name»? Например, url (regex1, EventView.ASView(), name=’events.list’), url (regex2, EventView.ASView(), name =’events.new’) и т. Д.?

3. И на самом деле, похоже, он способен обрабатывать необязательные группы. Если я сделаю это: url(r'^events(?:/(?P<event_id>d ))?/?$', EventView.as_view(), name='events') , это работает просто отлично. И это именованная группа захвата внутри необязательной группы удаления. Может быть, вы имели в виду группы ORed? Но, тем не менее, для меня это не совсем имеет смысл.

, EventView.as_view(), name=‘events’)

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

Например, скажем, я хочу пойти на:


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


И я получаю:


Я также пытался с именованными параметрами (вместо event_id=1) передать параметры в словаре, но все та же ошибка. Имейте в виду, если я удалю одну из групп захвата ORed, тогда она разрешится просто отлично.

Есть мысли?

Ответ №1:

Django не может отменить URL-адреса с дополнительными группами захвата, потому что он не может знать, что туда поместить. Лучший способ справиться с этой ситуацией — иметь несколько записей в urlconf: одну для версии без параметров, одну с идентификатором и одну с new .

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

Комментарии:

1. Есть идеи, почему он не сможет выполнить обратный поиск? если он идет слева направо, он должен соответствовать первой группе, в которую он должен вставить event.id (предполагая, что ожидание / возврат назад или жадность), а затем сопоставьте $.

2. Однако, если я использую 3 разных URL-адреса, как мне отличить их при обращении к ним? Должен ли я назначать им разные параметры «name»? Например, url (regex1, EventView.ASView(), name=’events.list’), url (regex2, EventView.ASView(), name =’events.new’) и т. Д.?

3. И на самом деле, похоже, он способен обрабатывать необязательные группы. Если я сделаю это: url(r'^events(?:/(?P<event_id>d ))?/?$', EventView.as_view(), name='events') , это работает просто отлично. И это именованная группа захвата внутри необязательной группы удаления. Может быть, вы имели в виду группы ORed? Но, тем не менее, для меня это не совсем имеет смысл.