0

ユーザーが英語を選択した場合にのみ、このURLを書き込む必要があるという要件がありますwww.example.com/something/something/www.example.com/en/something/something/

これは、通常の部分のURLが実行されたdjangoですでに実行されている既存のサイト用です。ユーザーが英語を選択した場合は、URLを書き直す必要があります。

djangoテンプレートのすべてのURLを手動で変更できると思いました

{% if request.session.language == 'en' %} 
    <a href="/en/something"..>
{% else %}
    <a href="/something"..>
{% endif %}

しかし、リンクの数が多すぎてこの方法で実行できないため、そのように実行しないように求められました。

次に、カスタムミドルウェアを試してみることを考えました。このミドルウェアでは、リクエストオブジェクトにアクセスしprocess_requestて、return HttpResponsePermanentRedirect(redirect_url)

しかしprocess_request、画像やその他のリンクを含め、すべてのリクエストを1つずつ処理しているようです。しかし、私が欲しいのは最初のリクエスト、つまりリクエストされた実際のURLです。

そこで、ミドルウェアのコンストラクターで同じことを試しました。これは、1回だけ呼び出され、それが最初の要求になることを期待しています。しかし、私が直面している問題は、オブジェクト__init__のみを受け入れself**argsオブジェクトを受け入れないrequestため、そこでセッション変数にアクセスできないことです。

これをapacheで試すことを考えましたが、ユーザーが英語を選択した場合にのみURLリダイレクトを実行する必要がありますが、常にそうとは限りません。

4

1 に答える 1

2

ドキュメントからdjangourlsパターンの国際化を読むと、その単純なプロセスに気付くでしょう。

  1. urls.pyあなたの:を更新します

    from django.conf.urls.i18n import i18n_patterns
    
    urlpatterns += i18n_patterns('',
        url(r'^something/$', 'something.view', name='something'),
        # other urls like you would normally have
    )
    
  2. のセクションにあることを確認django.middleware.locale.LocaleMiddlewareしてください。MIDDLEWARE_CLASSESsettings.py

それでおしまい。これで、ユーザーが選択した言語に基づいてパターンが更新されます。

于 2013-03-06T07:04:57.223 に答える