我正在使用i18n_patterns
对我的应用进行国际化并且它正常工作,除非我点击需要登录的链接(由@login_required
装饰者保护的视图),我被重定向到登录表单采用默认语言而不是当前活动的语言。
如何保存有效网址?换句话说,在法语部分,我希望@login_required
重定向我/fr/login/?next=/fr/clients/
而不是/en/login/?next=/fr/clients/
答案 0 :(得分:4)
我有同样的问题,我通过编辑settings.py来解决它:
from django.core.urlresolvers import reverse_lazy
LOGIN_URL = reverse_lazy('login')
函数reverse_lazy在URL上添加了正确的语言前缀! (“登录”是登录路线的名称)
答案 1 :(得分:1)
对于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
中登录视图的名称。
我没有对此进行测试,但如果出现问题,我会尝试尽我所能调试它。