Django — вопрос формирования url?

В проекте есть куча шаблонов, все урлы строятся через стандартный тег {% url %}. Часть урлов, скажем, такого вида:



urlpatterns = patterns("",<br>
    (r'^factory/(?P<fac>\d+)/', include(patterns('',<br>
        (r'^$', factory.index),<br>
        (r'^assembly/(?P<asm>\d+)/$', factory.assembly),<br>
        (r'^division/(?P<div>\d+)/$', factory.division),<br>
        (r'^division/(?P<div>\d+)/assembly/(?P<asm>\d+)/$', factory.assembly),<br>
    ))),<br>
)


Т.е. factory определяется из урла. Для некоторых factory нужны отдельные поддомены с примерно такими же страницами и теми же шаблонами. Сейчас сделано тупо — с главной поддомена редиректит на привязанный factory. Т.е. factory находится в двух частях урла — в домене и path info: super-factory.site.com/factory/25



Хочется сделать для поддоменов отдельный urlconf, в котором убрать из урлов factory/(?P\d+)/:

urlpatterns = patterns("",<br>
    (r'^', include(patterns('',<br>
        ……<br>
    )), {'fac': 'from_subdomain'}),<br>
)


Проблема возникает именно с формированием урлов. Если оставить все как есть:

{% url 'factory.assembly' fac=factory.id asm=assembly.id %}

то джанга не может найти нужный роут. Оборачивать каждый вызов в отдельный {% if %} — последнее дело. Пробовал сделать часть с factory необязательной:



urlpatterns = patterns("",<br>
    (r'^(?:factory/(?P<fac>\d+)/)?', include(patterns('',<br>
        ……<br>
    )), {'fac': 'from_subdomain'}),<br>
)


В этом случае джанга роут находит, но все делает «правильно», т.е. часть factory/(?P\d+)/ появляется в урле, а это почти тоже самое, что редирект.



Еще один некрасивый вариант, который приходит в голову — кастомный тег на основе {% url %}, но проверяющий какую-нибудь переменную и исключающий из параметров fac. Это почти тот же {% if %}, только за скобками.
  • Вопрос задан
  • 3396 просмотров
Пригласить эксперта
Ответы на вопрос 1
Prophet
@Prophet
django-hosts на первый взгляд должен подойти для решения этой задачи.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы