2

次の形式の URL があります。

http://example.com/[language_code]/xxx


1. 言語コードに基づいて、適切な DB を選択するか、言語コードがサポートされていない場合は Http 404 を発生させます。
2. テンプレートでアクセスできるように、できればリクエスト オブジェクトに言語コードを保存したいと思います。
3. urls.py が次のようにならないようにしたい:

url(r'^(?P<lang>\w+)/xxx/$', 'my_app.views.xxx')

むしろ:

url(r'^xxx/$', 'my_app.views.xxx')

そのため、django は URL の言語コードを完全に無視します。

これがdjangoで実行可能かどうか、または別の解決策を探す必要があるかどうか、誰か教えてもらえますか?

4

1 に答える 1

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

于 2013-05-16T08:20:32.027 に答える