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