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

Ada*_*ver 6 python django

我使用的i18n_patterns国际化我的应用程序,它的工作除了当我点击需要登录(通过保护的视图中的链接@login_required装饰),我被重定向到登录表单的默认语言,而不是当前的活动之一.

我如何保留活动URL?换句话说,在法语部分,我想@login_required重定向/fr/login/?next=/fr/clients/而不是/en/login/?next=/fr/clients/

oli*_*ool 5

我遇到了同样的问题,我通过编辑settings.py解决了它:

from django.core.urlresolvers import reverse_lazy

LOGIN_URL = reverse_lazy('login')
Run Code Online (Sandbox Code Playgroud)

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


Act*_*lis 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)
Run Code Online (Sandbox Code Playgroud)

其中,reverse('login') 获取您的登录视图的名称urls.py

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