2013-07-23 13 views
5

Używam i18n_patterns do internacjonalizacji mojej aplikacji i działa, chyba że kliknę link, który wymaga logowania (widok chroniony przez dekorator @login_required), jestem przekierowywany do formularza logowania w domyślny język zamiast aktualnie aktywnego.@login_required traci bieżący określony język

Jak mogę zachować aktywny adres URL? Innymi słowy, kiedy w sekcji francuskiej, chcę @login_required przekierować mi /fr/login/?next=/fr/clients/ zamiast /en/login/?next=/fr/clients/

Odpowiedz

0

Nie jestem dobrze zorientowany w i18n dla Django, ale nie sądzę, jest to rzeczywiście możliwe, ponieważ wiąże jego login_requiredlogin_url Parametr do dekorowanej funkcji w punkcie aplikacji dekoratora. Lepiej lepiej napisać własnego dekoratora; Zakładając, że nie należy używać jednego z opcjonalnych parametrów login_required, można tworzyć własne jak

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) 

gdzie odwróconych („login”) ją bez względu na nazwę widoku logowania w urls.py jest.

Nie testowałem tego, ale jeśli coś się pojawi, spróbuję debugować go najlepiej jak potrafię.

2

miałem ten sam problem, a ja go rozwiązać poprzez edycję settings.py:

LOGIN_URL = reverse_lazy('login') 

Funkcja reverse_lazy dodaje poprawny przedrostek języka na URL! (z "loginem" będącym nazwą trasy logowania)

+0

To powinna być zaakceptowana odpowiedź. –

Powiązane problemy