Django i18n_patterns:resolve()无法按预期工作 - python

解决了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视图相对应):

    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的网址解析器仅适用于当前语言。
    因此,在尝试使用 translation.activate 解析特定语言的url之前,您需要切换语言。

    要解析url,这意味着您必须事先了解该语言,切换到该语言,然后才能解析(基本上是localemiddleware会为您做什么)。

    对于反向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'],则将其从会话中删除并对其进行重定向。

    Django BigInteger自动递增字段作为主键? - python

    我目前正在建立一个涉及大量集体智慧的项目。每个访问该网站的用户都将创建一个唯一的配置文件,然后将他们的数据用于为自己和其他用户计算最佳匹配。默认情况下,Django创建一个INT(11)id字段来处理模型的主键。我担心这会很快溢出(即,大约2.4b个设备在未事先设置Cookie的情况下访问了该页面)。如何在MySQL中将其更改为BIGINT并在Django自…

    Django Python日期时间设置为午夜 - python

    我有django对象的日期时间,但可以是一天中的任何时间。它可以是一天中的任何时间,但我需要将时间设置为00:00:00(另一个日期设置为23:59:59,但原理是相同的)end_date = lastItem.pub_date 当前的结束日期是2002-01-11 12:34:56我需要怎么做才能将其更改为00:00:00?我试过了:end_date.ho…

    Django:使用contenttypes框架的一般关系示例? - python

    我已经多次浏览了有关contenttypes框架的Django文档,但我对它的理解不足以在项目中实现泛型关系。我一直在寻找有关此事的在线示例或教程,但找不到一个。称我为哑巴,但在这方面我需要一些帮助(请不要仅通过链接到文档来回答问题)。基于在线资源的缺乏,我相信如果您用一个完整的例子来回答这个问题,您的答案可能是迄今为止有关django通用关系(奖金!)的最…

    Django:我应该如何存储货币价值? - python

    我在这里遇到范式问题。我不知道该将钱存储为Decimal(),还是将其存储为字符串并将自己转换为十进制。我的推理是这样的: PayPal要求小数点后两位为,因此,如果我有49美元的产品,PayPal希望看到49.00。 Django的DecimalField()并未设置小数位数。它仅存储最大小数位数。因此,如果其中有49个字段,并且将字段设置为2个小数位,它…

    Django:错误:您无权访问该端口 - python

    我是整个安装的新手,请保持友善。在dev上,该命令通常可以正常工作,但是自从我尝试使用Django的不同命令以来,某些东西就出错了。python manage.py runserver 0.0.0.0:80 我没有使用此端口的权限了。我可以使用端口8080,但将端口添加到url中通常的主机名末尾时,网站无法正常工作。当我使用端口80时,无论如何我都无需在UR…