6

アプリを国際化するために使用i18n_patternsしていますが、ログインが必要なリンク (@login_requiredデコレータによって保護されたビュー) をクリックした場合を除いて機能しています。現在アクティブな言語ではなく、デフォルトの言語でログイン フォームにリダイレクトされます。

有効な URL を保持するにはどうすればよいですか? 言い換えれば、フランス語のセクションでは、代わりに@login_requiredリダイレクトしたい/fr/login/?next=/fr/clients//en/login/?next=/fr/clients/

4

2 に答える 2

5

同じ問題があり、settings.py を編集して解決しました。

from django.core.urlresolvers import reverse_lazy

LOGIN_URL = reverse_lazy('login')

関数 reverse_lazy は、URL に正しい言語プレフィックスを追加します。('login' はログイン ルートの名前です)

于 2014-12-16T09:24:17.610 に答える
2

私はDjangoのi18nに精通していませんが、デコレーターアプリケーションの時点でパラメーターを装飾された関数にlogin_requiredバインドするため、これは実際には可能ではないと思います。login_urlおそらく、独自のデコレータを作成する方がよいでしょう。オプションのパラメータを のいずれも使用しないと仮定するとlogin_required、次のように独自のパラメータを作成できます。

from django.contrib.auth.views import redirect_to_login
from django.core.urlresolvers import reverse
import functools

def login_required(fn):
    @functools.wraps(fn)
    def _decorated(request, *args, **kwargs):
        if request.user.is_authenticated():
            return fn(request, *args, **kwargs)

        path = request.get_full_path()
        login_url = reverse('login')
        return redirect_to_login(path, login_url)

ここで、reverse('login') は、あなたのログイン ビューの名前を取得しますurls.py

私はこれをテストしていませんが、何か問題が発生した場合は、できる限りデバッグを試みます。

于 2013-07-23T22:49:31.790 に答える