@login_required正在丢失当前指定的语言

时间:2013-07-23 21:02:42

标签: python django

我正在使用i18n_patterns对我的应用进行国际化并且它正常工作,除非我点击需要登录的链接(由@login_required装饰者保护的视图),我被重定向到登录表单采用默认语言而不是当前活动的语言。

如何保存有效网址?换句话说,在法语部分,我希望@login_required重定向我/fr/login/?next=/fr/clients/而不是/en/login/?next=/fr/clients/

2 个答案:

答案 0 :(得分:4)

我有同样的问题,我通过编辑settings.py来解决它:

from django.core.urlresolvers import reverse_lazy

LOGIN_URL = reverse_lazy('login')

函数reverse_lazy在URL上添加了正确的语言前缀! (“登录”是登录路线的名称)

答案 1 :(得分:1)

对于Django,我并不精通i18n,但我认为这实际上并不可行,因为login_requiredlogin_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中登录视图的名称。

我没有对此进行测试,但如果出现问题,我会尝试尽我所能调试它。

相关问题