解决了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创建一个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…