Я работал с 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()), но, безусловно, там хороший способ сделать это сейчас...