Можно также использовать структура модуль, чтобы сделать это:
>>> struct.unpack("
Я реализовал это, переопределив django.core.urlresolvers.reverse
моей пользовательской функцией:
from django.core import urlresolvers
from django.conf import settings
__real_reverse = urlresolvers.reverse
def reverse(viewname, urlconf=None, args=None, kwargs=None, prefix=None):
try:
return __real_reverse(viewname, urlconf, args, kwargs, prefix)
except urlresolvers.NoReverseMatch, no_match:
external_urlconfs = getattr(settings, 'EXTERNAL_URLCONFS', [])
for p, c in external_urlconfs:
c = urlresolvers.RegexURLResolver(r'^/', c)
try:
return p + c.reverse(viewname, *args, **kwargs)
except urlresolvers.NoReverseMatch:
pass
raise no_match
urlresolvers.reverse = reverse
Затем перечислив URLconfs в settings.py
вот так:
ROOT_URLCONF = 'project.urls_a'
EXTERNAL_URLCONFS = (
('http://b.example.com/', 'project.urls_b'),
)
Да, вам нужно будет создать свой собственный тег {% url%}
, который использует собственный метод разворота.
Например, для реверсирования специально для site_a urlconf, тогда вы можете использовать такой метод:
from django.core.urlresolvers import reverse
import site_a
def site_a_reverse(viewname, args=None, kwargs=None):
# If your sites share the same database, you could get prefix from Site.objects.get(pk=site_a.settings.SITE_ID)
prefix = 'http://a.example.com/' # Note, you need the trailing slash
reverse(viewname, urlconf=site_a.urls, args=args, kwargs=kwargs, prefix=prefix)
Я бы предложил внести два изменения. (1) Переместите шаблоны в общий каталог (а не для каждого приложения), если вы еще этого не сделали. (2) Изучите недавно добавленную функцию пространств имен URL .
Первое изменение позволит вам иметь общий базовый шаблон и выборочно переопределять его для различных приложений / сайтов. Второй может сделать ваши URL «суше».