Я уже некоторое время работаю с 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, какое пространство имен использовать?
РЕДАКТИРОВАТЬ: Мой вариант использования - использовать одну установку приложения несколько раз. То есть он существует на диске только один раз, но несколько раз включается в корневой каталог проекта urls.py
(каждый раз в другом пространстве имен, как в моем примере выше). Имея это в виду, есть ли хороший способ отслеживать, из какого пространства имен вызывается представление / шаблон, и использовать reverse ()
или {% url%}
придерживаться одного и того же пространства имен? Я знаю, что Django 1.3 предоставит некоторые дополнительные функции, которые могут помочь в этом (а именно, новый и улучшенный resolve ()
), но, безусловно, есть хороший способ сделать это сейчас ...