При использовании i18n_patterns, как изменить URL-адрес без кода языка

Я использую i18n_patterns, но я хочу использовать reverse для создания ссылки на страницу без языка в URL-адресе (чтобы пользователь был перенаправлен на основе файлов cookie, заголовков и т. д.).

я пытался

from django.utils.translation import activate, deactivate, get_language
current_lang = get_language()
deactivate()
url = reverse(things)
activate(current_lang)

Это работает для получения других языковых версий с использованием activate(target_lang), но если я deactivate, я просто получаю URL-адреса для языка по умолчанию (/en/account/, но я хочу /account/).

Я уже думал, что получение альтернативных языковых версий слишком сложно, но я никак не могу справиться с этим. Любые подсказки? (Без удаления вручную LANGUAGE_CODE из URL-адреса)

ОБНОВЛЕНИЕ: я также пытался

from django.core.urlresolvers import get_resolver
get_resolver(None).reverse(*args, **kwargs)

но получить NoReverseMatch


person Mark    schedule 28.12.2014    source источник


Ответы (2)


Я думаю, что самый простой способ — позволить Django разрешить URL-адрес с языковым префиксом, а затем просто удалить языковой префикс.

Вы можете написать следующую функцию:

import re
from django.core.urlresolvers import reverse

def reverse_no_i18n(viewname, *args, **kwargs):
    result = reverse(viewname, *args, **kwargs)
    m = re.match(r'(/[^/]*)(/.*$)', result)
    return m.groups()[1]

Теперь в любом месте вашего кода вы можете сделать что-то вроде этого:

from myproject.utils import reverse_no_i18n

def my_view(request):
    return HttpResponseRedirect(reverse_no_i18n('my_view_name'))

Вы также можете создать собственный тег шаблона {% url %}, который вызывает вашу пользовательскую функцию.

person mbrochh    schedule 01.01.2015
comment
Спасибо. Я бы предпочел менее хакерский способ, но, похоже, его не существует. - person Mark; 03.03.2015

Я также потратил время, чтобы найти хорошее решение, и вот мое.

Рядом с основным файлом URL-адресов («my_project/urls.py») создайте файл «my_project/urls_without_lang.py» с указанным ниже содержимым.

Затем вы можете использовать reverse('viewname', urlconf='my_project.urls_without_lang')

Джанго=‹1.11

from copy import copy

from django.urls.resolvers import LocaleRegexURLResolver

from .urls import urlpatterns as urlpatterns_i18n

"""
Purpose of this file is to be able to reverse URL patterns without language prefix.
This is usefull to build URL meant to be communicated "outside" of the domain without any language duty.

To use it with 'reverse' method (from django.shortcuts module), simply give the additional parameter:
    `urlconf='my_project.urls_without_lang'`
Example: `reverse('viewname', urlconf='my_project.urls_without_lang')`
"""

urlpatterns = copy(urlpatterns_i18n)
for el in urlpatterns_i18n:
    if isinstance(el, LocaleRegexURLResolver):
        urlpatterns.remove(el)
        urlpatterns += el.url_patterns

Джанго>1.11

from copy import copy

from django.urls import URLResolver

from .urls import urlpatterns as urlpatterns_i18n

urlpatterns = copy(urlpatterns_i18n)
for el in urlpatterns_i18n:
    if isinstance(el, URLResolver) and isinstance(el.urlconf_name, list):
        urlpatterns.remove(el)
        urlpatterns += el.url_patterns

Надеюсь, это поможет некоторым из вас.

person Gosti    schedule 22.05.2019