带有 django-translated-fields 的多语言 slug
Multilingual slug with django-translated-fields
我正在尝试在 django-translated-fields 的帮助下实现多语言 Django 网站。
我正在进行的项目基于cookiecutter-django和Docker。
翻译适用于我的模型字段——除了 slug 字段。实际上 slug 的翻译也有效,但我无法使用 slug 字段来获取一个条目。
投票模型摘录:
class Voting(models.Model):
slug = TranslatedField(
models.SlugField(
max_length=80,
unique=True,
verbose_name="Voting URL slug",
blank=True
),
{
"de": {"blank": True},
"fr": {"blank": True},
"it": {"blank": True},
"rm": {"blank": True},
"en": {"blank": True},
},
)
项目完整投票模型可见here.
观点摘录:
def voting(request, slug):
voting = get_object_or_404(Voting, slug=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
可以看到全图here
由于 Django 翻译的字段创建了 slug_en
、slug_de
等等,所以我找不到用相应语言获取 slug 的解决方案。
这应该是显而易见的,因为 Django 翻译字段的文档说:
没有实际创建模型字段。 TranslatedField 实例是一个描述符,默认情况下充当当前语言字段的 属性。
不幸的是,无论如何都没有得到它。知道如何更改投票模型以获取特定语言的条目吗?
不确定这是否正确,但在 Django 文档“How Django discovers language preference”的帮助下,我找到了以下解决方案。
更改投票视图如下:
def voting(request, slug):
'''Takes slug of single voting and returns that voting object in
corresponding language.
'''
if request.LANGUAGE_CODE == 'de':
voting = get_object_or_404(Voting, slug_de=slug)
elif request.LANGUAGE_CODE == 'fr':
voting = get_object_or_404(Voting, slug_fr=slug)
elif request.LANGUAGE_CODE == 'it':
voting = get_object_or_404(Voting, slug_it=slug)
elif request.LANGUAGE_CODE == 'rm':
voting = get_object_or_404(Voting, slug_rm=slug)
elif request.LANGUAGE_CODE == 'en':
voting = get_object_or_404(Voting, slug_en=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
from translated_fields import to_attribute
def voting(request, slug):
voting = get_object_or_404(Voting, **{to_attribute(name='slug'): slug})
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
如有必要,您可以将 language_code=request.LANGUAGE_CODE
添加到对 to_attribute
的调用中,但通常这不是必需的:
voting = get_object_or_404(Voting, **{to_attribute(name='slug', language_code=request.LANGUAGE_CODE): slug})
我正在尝试在 django-translated-fields 的帮助下实现多语言 Django 网站。
我正在进行的项目基于cookiecutter-django和Docker。
翻译适用于我的模型字段——除了 slug 字段。实际上 slug 的翻译也有效,但我无法使用 slug 字段来获取一个条目。
投票模型摘录:
class Voting(models.Model):
slug = TranslatedField(
models.SlugField(
max_length=80,
unique=True,
verbose_name="Voting URL slug",
blank=True
),
{
"de": {"blank": True},
"fr": {"blank": True},
"it": {"blank": True},
"rm": {"blank": True},
"en": {"blank": True},
},
)
项目完整投票模型可见here.
观点摘录:
def voting(request, slug):
voting = get_object_or_404(Voting, slug=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
可以看到全图here
由于 Django 翻译的字段创建了 slug_en
、slug_de
等等,所以我找不到用相应语言获取 slug 的解决方案。
这应该是显而易见的,因为 Django 翻译字段的文档说:
没有实际创建模型字段。 TranslatedField 实例是一个描述符,默认情况下充当当前语言字段的 属性。
不幸的是,无论如何都没有得到它。知道如何更改投票模型以获取特定语言的条目吗?
不确定这是否正确,但在 Django 文档“How Django discovers language preference”的帮助下,我找到了以下解决方案。
更改投票视图如下:
def voting(request, slug):
'''Takes slug of single voting and returns that voting object in
corresponding language.
'''
if request.LANGUAGE_CODE == 'de':
voting = get_object_or_404(Voting, slug_de=slug)
elif request.LANGUAGE_CODE == 'fr':
voting = get_object_or_404(Voting, slug_fr=slug)
elif request.LANGUAGE_CODE == 'it':
voting = get_object_or_404(Voting, slug_it=slug)
elif request.LANGUAGE_CODE == 'rm':
voting = get_object_or_404(Voting, slug_rm=slug)
elif request.LANGUAGE_CODE == 'en':
voting = get_object_or_404(Voting, slug_en=slug)
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
from translated_fields import to_attribute
def voting(request, slug):
voting = get_object_or_404(Voting, **{to_attribute(name='slug'): slug})
context = {
'voting': voting
}
return render(request, 'votes/single.html', context)
如有必要,您可以将 language_code=request.LANGUAGE_CODE
添加到对 to_attribute
的调用中,但通常这不是必需的:
voting = get_object_or_404(Voting, **{to_attribute(name='slug', language_code=request.LANGUAGE_CODE): slug})