4

我正在使用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我只获取默认语言的网址(/en/account/但我想要/account/)。

我已经认为获得替代语言版本过于复杂,但我根本无法管理。有什么提示吗?(无需手动LANGUAGE_CODE从 url 中剥离)

更新:我也试过

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

但得到NoReverseMatch

4

2 回答 2

3

我认为最简单的方法是让 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 %}模板标签来调用您的自定义函数。

于 2015-01-01T02:22:36.423 回答
0

我还花时间找到了一个不错的解决方案,这是我的。

在主 urls 文件 ('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

希望这会帮助你们中的一些人。

于 2019-05-22T13:11:20.640 回答