Я работал с Django некоторое время (сейчас на версии 1.2), но совсем недавно начал работать над приложением, которое должно поддерживать несколько экземпляров. Например, файл проекта urls.py
будет включать его дважды в двух разных пространствах имен, например:
urlpatterns = patterns('',
(r'^instance1/', include('myapp.urls', namespace='instance1')),
(r'^instance2/', include('myapp.urls', namespace='instance2')),
)
Я хорошо разбирался, пока не понял, что мне нужно выяснить, что делать со всеми внутренними вызовами reverse()
(или вызовы шаблонов для фильтра {% url %}
). Например, скажем, я делаю что-то вроде следующего в одном из моих представлений:
return HttpResponseRedirect(reverse('view_name'))
или что-то вроде этого в одном из моих шаблонов:
<a href="{% url view_name %}">link text</a>
... где view_name
- это имя шаблона URL, содержащегося в myapp.urls
. Поскольку я использую пространства имен, это вызовет ошибку: нет представления под названием view_name
. Скорее, я должен сказать это либо instance1:view_name
, либо instance2:view_name
. Но делать это динамически меня бросает.
Я немного посмотрел, и похоже, что аргумент current_app
, переданный либо в Context
, либо RequestContext
, был разработан, чтобы помочь с этим, но не совсем ясно, как динамически передавать правильное имя приложения current_app
. Итак, какой правильный способ сказать Django, какое пространство имен использовать?
EDIT: Моим вариантом использования является использование одной установки приложения несколько раз. То есть, он существует только один раз на диске, но включается несколько раз в корень проекта urls.py
(каждый раз под другим пространством имен, как в моем примере выше). Имея это в виду, есть ли хороший способ отслеживать, какое пространство имен вызывается из вида/шаблона, и использовать любое использование reverse()
или {% url %}
в том же пространстве имен? Я знаю, что Django 1.3 предоставит некоторые дополнительные функции, которые могут помочь в этом (а именно новый и улучшенный resolve()
), но, безусловно, там хороший способ сделать это сейчас...