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 上添加正确的语言前缀!(“登录”是您的登录路线的名称)

于 2014-12-16T09:24:17.610 回答
2

我不精通 Django 的 i18n,但我认为这实际上是不可能的,因为在装饰器应用程序点将login_required其参数绑定login_url到装饰函数。您最好编写自己的装饰器;假设您不使用任何一个可选参数 to 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 回答