Сторнирование URL-адресов Django с дополнительными параметрами - PullRequest
13 голосов
/ 18 марта 2009

Предположим, у меня есть URLconf, как показано ниже, и 'foo' и 'bar' являются допустимыми значениями для page_slug.

urlpatterns = patterns('',
    (r'^page/(?P<page_slug>.*)/', 'myapp.views.someview'),
)

Тогда я мог бы восстановить URL-адреса с помощью приведенного ниже, верно?

>>> from django.core.urlresolvers import reverse
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'})
'/page/foo/'
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'})
'/page/bar/'

Но что, если я изменю свой URLconf на этот?

urlpatterns = patterns('',
    (r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}),
    (r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}),
)

Я ожидал этого результата:

>>> from django.core.urlresolvers import reverse
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'foo'})
'/foo-direct/'
>>> reverse('myapp.views.someview', kwargs={'page_slug': 'bar'})
'/my-bar-page/'

Однако это вызывает исключение NoReverseMatch. Я подозреваю, что пытаюсь сделать что-то невозможное. Какие-нибудь предложения относительно более разумного способа достигнуть того, что я хочу?

Именованные URL-адреса не подходят, так как я не хочу, чтобы другие приложения, ссылающиеся на них, должны были знать о специфике структуры URL (инкапсуляция и все такое).

Ответы [ 3 ]

20 голосов
/ 18 мая 2010

Вы должны попробовать назвать ваши urlconfs. Пример:

urlpatterns = patterns('',
    url(r'^foo-direct/', 'myapp.views.someview', {'page_slug': 'foo'}, name='foo-direct'),
    url(r'^my-bar-page/', 'myapp.views.someview', {'page_slug': 'bar'}, name='bar-page'),
)

Тогда просто отредактируйте свои реверсы, и вы должны заставить его работать.

>>> from django.core.urlresolvers import reverse
>>> reverse('foo-direct', kwargs={'page_slug': 'foo'})
'/foo-direct/'
>>> reverse('bar-page', kwargs={'page_slug': 'bar'})
'/my-bar-page/'

Больше информации на: Django Docs

7 голосов
/ 18 марта 2009

Вот что мы делаем.

urls.py имеет такие шаблоны

url(r'^(?P< datarealm >.*?)/json/someClass/(?P<object_id>.*?)/$', 'json_someClass_resource', ),

views.py как обратные вызовы, подобные этому

    object = SomeModel.objects.get(...)
    url= reverse('json_someClass_resource', kwargs={'object_id':object.id,'datarealm':object.datarealm.name})
4 голосов
/ 19 марта 2009

Именованные URL должны быть опцией. Ваш случай выделен ссылкой Django:

http://docs.djangoproject.com/en/dev/topics/http/urls/?from=olddocs#id2

Я не уверен, что дизайнеры оставили другой обходной путь; они ожидали, что названные URL-адреса покроют это.

Могу ли я отвлечься от инкапсуляции? Благодарю. Есть две основные причины:

  1. Абстракция - никто не хочет , чтобы увидеть детали
  2. Безопасность - никто не должен подробности

Что касается 1, вы можете получить приличное количество пробега в Python, и Django является отличным примером. Что касается 2, это интерпретированный язык. Либо вы запускаете его там, где написано, либо отправляете скомпилированные файлы .pyc. Если это действительно то, что вы делаете, то скомпилируйте URL-адрес.

Наконец, кажется, что он менее инкапсулирован, чтобы позволить другим приложениям знать о функциях, чем структура URL. Но если вы действительно не согласны, я думаю, вам придется реализовать более гибкий обратный метод самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...