Я знаю, что это довольно старый вопрос ... но я думаю, что нашел решение:
Как предположил Уилл Харди, вы должны будете оставить app_name
одинаковым для обоих экземпляров (или вообще не определять его, оно по умолчанию будет соответствовать приложению, в котором находятся включенные URL). Определите отдельное пространство имен для каждого экземпляра приложения:
urlpatterns = patterns('',
(r'^carphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='car-photos') ),
(r'^userphotos/', include('webui.photos.urls', app_name="webui_photos", namespace='profile-photos') ),
)
Теперь немного сложная настройка текущего активного экземпляра приложения (пространства имен) в ваших представлениях. Это означает, что вы должны выяснить, какой экземпляр приложения активен, и передать его RequestContext
.
.
Чтобы найти текущее активное приложение, можно использовать django.core.urlresolvers.resolve
:
r = resolve(request.path)
r.app_name # the app name
r.namespace # the the currently active instance
Таким образом, вам придется обновить свои представления (это предполагает использование представлений на основе классов):
from django.core.urlresolvers import resolve
from django.views.generic import TemplateView
class AlbumCreateView(TemplateView):
template_name = 'path/to/my/template.html'
def render_to_response(self, context, **response_kwargs):
response_kwargs['current_app'] = resolve(self.request.path).namespace
return super(AlbumPageView, self).render_to_response(context, **response_kwargs)
Теперь тег URL будет автоматически возвращаться к правильному пространству имен и по-прежнему разрешать обращение к определенному пространству имен приложения, если это необходимо:
{% url webui_photos:album-create %} {# returns the url for whatever app is current #}
{% url car-photos:album-create %}
{% url profile-photos:album-create %}
Чтобы отменить URL в представлениях, текущий экземпляр приложения должен быть передан вручную:
reverse('webui_photos:album-create', current_app=resolve(self.request.path).namespace))