带有 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_enslug_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})