2010-07-28 2 views
0

Предположит, приложение Django, shop, которого urls.py входит в основном urls.py:Джанго: Обратный URL-поиск с произвольными компонентами URL

# 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 или стволу СВН), чтобы включить обратный поиск, чтобы использовать только один и тот же префикс, что есть в текущем URL? Например, если request.path является /foo/shop/, что {% urls shop_product id=1 %} возвращает

/foo/shop/product/1 

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

ответ

1

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

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

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

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

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

+0

Хм, я так боялся (и начал мысленно внедрять расширение templatetag url). Спасибо за ответ. – Boldewyn

 Смежные вопросы

  • Нет связанных вопросов^_^