gpt4 book ai didi

python - Django i18n_patterns : resolve() doesnt work as expected

转载 作者:行者123 更新时间:2023-12-01 13:49:52 27 4
gpt4 key购买 nike

解决这个问题后here ,还有一个:如果你在这里使用翻译url系统https://docs.djangoproject.com/en/1.8/topics/i18n/translation/你会看到你添加了像 urlpatterns += i18n_patterns(...) 这样的模式.

问题是基本网址 没有 不考虑语言,即:

  • resolve('/fr/produits/')作品,
  • 但是 resolve('/produits/')不起作用并引发 404。

  • 如何解决这个问题?

    这是我的网址:
    urlpatterns = [
    url(r'^debug/?$', p_views.debug, name='debug'),
    url(r'^i18n/', include('django.conf.urls.i18n')),
    url(r'^login/(\w*)', p_views.login, name='login'),
    url(r'^admin/', include(admin_site.urls)),
    url(r'^public/(?P<path>.*)$',
    'django.views.static.serve',
    {'document_root': settings.MEDIA_ROOT},
    name='url_public'
    ),
    ]
    urlpatterns += i18n_patterns(
    url(_(r'^produits/detail/(?P<slug>[a-zA-Z0-9-_]+)/$'),
    p_views.ProduitDetailView.as_view(), name='produits_detail'),
    url(_(r'^produits/'),
    p_views.IndexView.as_view(), name='produits_index'),
    )

    这是我制作的非常简单的 URL 测试器(对应于 /debug View ):
    def debug(req):

    def test(url):
    try:
    return u'<pre>{0} {1}</pre>'.format(url, resolve(url))
    except Resolver404:
    return u'<pre>{0} {1}</pre>'.format(url, 'None')

    response = HttpResponse()
    response.write(test('produits'))
    response.write(test('produits/'))
    response.write(test('/produits'))
    response.write(test('/produits/'))
    response.write(test('/fr/produits'))
    response.write(test('/fr/produits/'))
    response.write(test('/en/products/'))
    response.write(test('/sv/produkter/'))
    return response

    这是 http://localhost:8000/debug页:
    produits None
    produits/ None
    /produits None
    /produits/ None
    /fr/produits None
    /fr/produits/ ResolverMatch(func=produits.views.IndexView, args=(), kwargs={}, url_name=produits_index, app_name=None, namespaces=[])
    /en/products/ None
    /sv/produkter/ None

    最后三行应该都返回 ResolverMatch(...)因为它们都是有效的 URL。

    最佳答案

    Django 的 url 解析器仅适用于当前语言。
    因此,在尝试使用特定语言解析 url 之前,您需要切换语言,使用 translation.activate .

    对于解析 url,这意味着您必须事先知道语言,切换到它然后才解析(基本上本地中间件将为您做什么)。

    对于反转 url,这意味着您可能应该使用其名称反转 url。您将返回当前语言的 url。我现在无法测试,但它应该像这样工作:

    from django.utils import translation
    translation.activate('fr')
    reverse('produits_index') # /fr/produits/
    translation.activate('en')
    reverse('produits_index') # /en/products/

    如果您确实设法获得了 ResolverMatch对象,您将 url 名称作为其属性,方便地命名为 url_name .

    我希望它有帮助,我有点不清楚你想要做什么。请随意评论/编辑您的问题,我会尝试更新此答案。

    Olivier Pons 更新

    这是工作解决方案:

    这是我的工作解决方案,它接近光谱,但按我想要的方式工作:
    # (!) resolve() use current language
    # -> try to guess language then activate BEFORE resolve()
    lg_curr = translation.get_language()
    lg_url = get_language_from_path(url) or lg_curr
    translation.activate(lg_url)
    try:
    resolve(url)
    req.session['url_back'] = url # no error -> ok, remember this
    except Resolver404:
    pass
    translation.activate(lg_curr)

    ...然后,在成功注册/登录后,如果有 req.session['url_back']然后我从 session 中删除它并对其进行重定向。

    关于python - Django i18n_patterns : resolve() doesnt work as expected,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738840/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com