Обращение URL-адресов в пространстве имен в Django: несколько экземпляров одного и того же приложения

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

12
задан mjjohnson 20 November 2010 в 03:20
поделиться