Django: обратный просмотр URL с произвольными компонентами URL - PullRequest
0 голосов
/ 28 июля 2010

Предположим, приложение Django, shop, чей urls.py включен в основной urls.py:

# main urls.py
urlpatterns = patterns('',
    (r'^[^/]+/shop/', include('shop.urls')),
)

Обратите внимание, что перед /shop стоит произвольный префикс. Это не представляет интереса для приложения shop, оно интересно только для некоторого промежуточного программного обеспечения.

shop.urls может выглядеть так:

# shop's urls.py
urlpatterns = patterns('',
    url(r'^$', index, name="shop_index"),
    url(r'^product/(?P<id>[^/]+)$', product, name="shop_product"),
)  

Теперь я хочу использовать {% url %} в моих shop шаблонах. Что разрушает этот план, так это то, что сгенерированный URL не содержит префикса из глобального urls.py. Сгенерированные URL выглядят больше как, например,

/^/shop/product/1

Вопрос: Теперь, есть ли возможность (в Django 1.2 или svn trunk) разрешить обратному поиску использовать тот же префикс, который есть в текущем URL? Например, если request.path равно /foo/shop/, то {% urls shop_product id=1 %} возвращает

/foo/shop/product/1

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

1 Ответ

1 голос
/ 28 июля 2010

Нет, нет, ни в коем случае не прямой путь Джанго.Django не имеет представления о том, что вы имеете в виду под [^ /] +, в вашем случае это префикс, который должен динамически добавляться к обратному поиску URL.

Интересно также, почему вы добавляете специфичное для промежуточного ПОИнформация для URL, и даже не как GET Paramters, делать что-то вроде этого, просто напрашиваясь на проблемы imho.Если вы говорите, что префикс специфичен для промежуточного программного обеспечения, нет смысла связываться с ним где-то за пределами промежуточного программного обеспечения.

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

/{{ environment_prefix }}{% filter slice:"1:" %}{% url shopview %}{% endfilter %}

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

...