0

我正在尝试在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 实例是一个描述符,默认情况下充当当前语言字段的属性。

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

4

2 回答 2

1
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})
于 2020-01-26T09:31:08.677 回答
0

不确定这是否是正确的方法,但在 Django 文档“<a href="https://docs.djangoproject.com/en/2.2/topics/i18n/translation/#how-django-discovers-language-preference 的帮助下“ rel="nofollow noreferrer">Django 如何发现语言偏好” 我来到以下解决方案。

更改投票视图如下:

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)
于 2019-05-12T18:43:02.487 回答