drd*_*man 8 django url reverse templates dry
可能是一个简单的问题,我只是错过了一些东西,但是我的想法很糟糕.
我有Django项目服务于几个具有截然不同sessions.py且完全不同ROOT_URLCONF的网站.一个站点处理用户注册,身份验证和配置文件设置,其他站点(在另一个域上)充当文件管理器等.站点共享相同的数据库,媒体和模板.所有站点都共享相同的用户群,实现了一种透明的单点登录/单点登录机制.它就像一个跨越多个领域的大型网站.
问题是,{% url %}我的模板中有很多标签,当模板在其他网站上使用时,它们不起作用.我想尽可能避免硬编码网址.
例如,在网站A(a.example.org)上我有一个
url('^users/$', 'example.accounts.list_users', name='list_users'),
Run Code Online (Sandbox Code Playgroud)
在A的URLconf中输入.然后,在一些global_menu.html模板中我有{% url list_users %},显然它完美地工作,导致" /users/".
现在,有站点B(b.example.org),与A共享许多内部.为了具有共同的外观,我想global_menu.html在站点B上使用相同的并且想要{% url list_users %}输出" http://a.example.org/users/".我能做到这一点的最好方法是什么?
目前,我正在global_menu.html为每个站点使用单独的,但这违反了DRY原则,并不是很方便.而且,是的,我正在使用Django的contrib.sites框架,为每个站点SITE_ID定义了不同的s settings.py,但实际上还没有在其他任何地方使用它.
更新:目前我正在考虑重新实现url标记或猴子修补reverse(),调用原始版本,并且异常在一些"外部URI列表"中执行额外查找.如果已经存在这样的事情 - 我会很高兴听到.
提前谢谢你的答案!
drd*_*man 12
我已经通过覆盖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
Run Code Online (Sandbox Code Playgroud)
然后列出URLconfs,settings.py如下所示:
ROOT_URLCONF = 'project.urls_a'
EXTERNAL_URLCONFS = (
('http://b.example.com/', 'project.urls_b'),
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2006 次 |
| 最近记录: |