Python Django i18n_模式:resolve()无法按预期工作

Python Django i18n_模式:resolve()无法按预期工作,python,django,python-2.7,internationalization,Python,Django,Python 2.7,Internationalization,解决这个问题之后,还有一个问题:如果您在这里使用翻译url系统,您将看到添加了类似urlpatterns+=i18n\u模式(…)的模式 问题在于,不包含该语言的基本url,即: resolve('/fr/produits/')works 但是resolve('/produits/')不起作用,会引发404 如何解决这个问题 以下是我的网址: urlpatterns = [ url(r'^debug/?$', p_views.debug, name='debug'), url

解决这个问题之后,还有一个问题:如果您在这里使用翻译url系统,您将看到添加了类似
urlpatterns+=i18n\u模式(…)
的模式

问题在于,不包含该语言的基本url,即:

  • resolve('/fr/produits/')
    works
  • 但是
    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,解析(url)) 除解析器404外: 返回u'
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
from django.utils import translation
translation.activate('fr')
reverse('produits_index')    # /fr/produits/
translation.activate('en')
reverse('produits_index')    # /en/products/

最近的三行都应该返回
ResolverMatch(…)
,因为它们都是有效的url。

Django的url解析程序只在当前语言上工作。 因此,在尝试使用特定语言解析url之前,需要切换语言

对于解析url,这意味着您必须事先了解该语言,切换到该语言,然后再解析(基本上就是LocalEmidware将为您做的事情)

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

如果您确实获得了一个
ResolverMatch
对象,那么您就可以将url名称作为其属性,方便地命名为
url\u name

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


Olivier Pons更新


以下是可行的解决方案:

这是我的工作解决方案,接近思百吉,但工作方式符合我的要求:


…然后,在成功注册/登录后,如果有
req.session['url\u back']
,我将其从会话中删除,并对其进行重定向。

相关:@Sayse谢谢,但我已经阅读了它,它并不能解决我的问题。我想做一些“反向翻译”,从
/sv/produkter/
/fr/produits/
(看看它是一个有效的URL)是的,这就是为什么我没有将它标记为重复。我没有找到确切的解决方案,也没有时间帮助我恐怕我已经更新了我的问题以显示更多细节。我已经添加了我的工作解决方案,以便我可以检查你的答案是否有效
:)
太好了!这正是我一天来一直在寻找和试图弄明白的
from django.utils import translation
translation.activate('fr')
reverse('produits_index')    # /fr/produits/
translation.activate('en')
reverse('produits_index')    # /en/products/
# (!) 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)