【问题标题】:Multilingual slug with django-translated-fields带有 django 翻译字段的多语言 slug
【发布时间】:2019-09-22 18:42:54
【问题描述】:

我正在尝试在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 等等,我找不到相应语言的解决方案。

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

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

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

【问题讨论】:

    标签: django django-models django-views django-translated-fields


    【解决方案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})
    

    【讨论】:

    • 感谢 Uri 提供的解决方案 :-)
    【解决方案2】:

    不确定这是否正确,但在 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)
    

    【讨论】:

    • 您可以使用to_attribute* 在一行中使用LANGUAGE_CODE。在这种情况下,您不必像以前那样定义它 5 次。
    • 类似get_object_or_404(Voting, **{to_attribute(name='slug'): slug})
    • 如有需要,您可以在对to_attribute的调用中添加language_code=request.LANGUAGE_CODE
    猜你喜欢
    • 2015-04-03
    • 2017-09-08
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多