Как сделать обратный поиск URL в многоразовом приложении Django - PullRequest
24 голосов
/ 26 августа 2010

Учтите, что я включаю многоразовое приложение с пространством имен:

urlpatterns = patterns('',
    # ella urls
    url('^ella/', include('ella.core.urls', namespace="ella")),
)

Теперь в приложениях Ella есть такие URL:

urlpatterns = patterns( '',
    url( r'^(?P<category>[a-z0-9-/]+)/$', category_detail, name="category_detail" ),
    # object detail
    url( r'^(?P<category>[a-z0-9-/]+)/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<content_type>[a-z0-9-]+)/(?P<slug>[a-z0-9-]+)/$',
        object_detail, name="object_detail" )
)

Теперь вызов {% url ella:category_detail category="cat" %} работает нормально. Однако, когда объект пытается сгенерировать ссылку на свои данные, он вызывает

from django.core.urlresolvers import reverse
url = reverse('object_detail', kwargs={'required' : 'params'})

Это не работает, если не переписано как

from django.core.urlresolvers import reverse
url = reverse('ella:object_detail', kwargs={'required' : 'params'})

Итак, если я правильно понимаю, включение многоразового приложения в пространство имен нарушает все внутренние reverse () внутри данного приложения .

Это правда? Что я пропустил? Есть ли способ обойти?

Ответы [ 3 ]

6 голосов
/ 30 августа 2010

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

Но, если вы хотите избежать этого, вы также можете передать пространство имен / appname в качестве параметра current_app. Есть несколько способов указать current_app, когда вы находитесь в шаблоне. Но если вы видите, вам нужно жестко кодировать, как вы сделали, или передать параметр current_app

url = reverse('object_detail', 
              kwargs={'foo':'bar'}, 
              current_app=app_name_or_name_space)

см .: http://docs.djangoproject.com/en/dev/topics/http/urls/#reverse

0 голосов
/ 16 июня 2015

По крайней мере в Django 1.8 вы можете написать что-то вроде этого:

url = reverse('%s:object_detail' % request.resolver_match.namespace, kwargs={'required' : 'params'})

request.resolver_match.namespace - строка, содержащая пространство имен текущего запущенного представления.

0 голосов
/ 25 октября 2010

Пространства имен URL можно указывать двумя способами.

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

(r '^ help /', include ('apps.help.urls', namespace = 'foo', app_name = 'bar')),

Это верно с http://docs.djangoproject.com/en/dev/topics/http/urls/#defining-url-namespaces.

Попробуйте изменить include('ella.core.urls', namespace="ella") на include('ella.core.urls', namespace="ella", app_name="ella").Я не на 100%, это сработает, но стоит попробовать.

...