首页 > 解决方案 > 带有 django 翻译字段的多语言 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},
        },
    )

项目的完整投票模型可以在这里看到。

观点摘录:

def voting(request, slug):
    voting = get_object_or_404(Voting, slug=slug)
    context = {
        'voting': voting
    }
    return render(request, 'votes/single.html', context)

完整视图可以在这里看到

由于 Django 翻译的字段创建slug_enslug_de等等,我找不到以相应语言获取 slug 的解决方案。

这应该很明显,因为 Django 翻译字段的文档说:

实际上没有创建模型字段。TranslatedField 实例是一个描述符,默认情况下充当当前语言字段的属性。

不幸的是,无论如何都没有得到它。知道如何更改投票模型以获取特定语言的条目吗?

标签: djangodjango-modelsdjango-viewsdjango-translated-fields

解决方案


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})

推荐阅读