我有以下格式的网址:
http://example.com/[language_code]/xxx
我需要这样做:
1.根据语言代码,如果不支持语言代码,我想选择合适的数据库或提高Http 404
2.我想将语言代码保存在请求对象中,因此我可以在模板中访问它
我不喜欢我的urls.py看起来不像这样:
url(r'^(?P<lang>\w+)/xxx/$', 'my_app.views.xxx')
而是:
url(r'^xxx/$', 'my_app.views.xxx')
所以django将完全忽略URL中的语言代码。
如果django可行,或者我应该寻找其他解决方案,有人可以告诉我吗?
答案 0 :(得分:2)
我设法解决了这个问题。首先,您需要阅读文档:https://docs.djangoproject.com/en/dev/topics/i18n/translation/
@ 1 - 我根据http://djangosnippets.org/snippets/2037/编写了自己的中间件(将此中间件作为MIDDLEWARE_CLASSES
列表中的第一个中间件至关重要)
import threading
from django.http import Http404
from django.conf import settings
request_cfg = threading.local()
class RouterMiddleware(object):
def process_view(self, request, view_func, view_args, view_kwargs):
lang = request.LANGUAGE_CODE
if lang in settings.LANGUAGES:
request_cfg.lang = lang
else:
raise Http404()
def process_response(self, request, response):
if hasattr(request_cfg, 'lang'):
del request_cfg.lang
return response
class DatabaseRouter(object):
def _default_db(self):
if hasattr(request_cfg, 'lang') and request_cfg.lang in settings.DATABASES:
return request_cfg.lang
else:
return 'default'
def db_for_read(self, model, **hints):
return self._default_db()
def db_for_write(self, model, **hints):
return self._default_db()
@ 2 - 可以使用request.LANGUAGE_CODE
@ 3 - 在文档中解释:https://docs.djangoproject.com/en/dev/topics/i18n/translation/#internationalization-in-url-patterns