带有django翻译字段的多语言slug

带有django翻译字段的多语言slug,django,django-models,django-views,django-translated-fields,Django,Django Models,Django Views,Django Translated Fields,我正试图在的帮助下实现一个多语言的Django网站 我正在从事的项目是基于和Docker的 该转换适用于我的模型字段–除了slug字段。实际上,slug的翻译也很有效,但我不能用slug字段来获得一个条目 投票模式摘录: class Voting(models.Model): slug = TranslatedField( models.SlugField( max_length=80, unique=True,

我正试图在的帮助下实现一个多语言的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)
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)
可以看到项目的完整投票模式

观点摘录:

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)
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)
可以看到全景

由于Django翻译字段创建
slug\u en
slug\u de
等等,因此我无法找到用相应语言获取slug的解决方案

这应该是显而易见的,因为Django翻译字段的文档说明:

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


不幸的是,无论如何都不明白。你知道如何更改投票模式以获得特定语言的条目吗?

不确定这是否正确,但在Django文档的帮助下“我找到了以下解决方案

更改投票视图如下:

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

如有必要,您可以将
language\u code=request.language\u code
添加到对
to\u属性的调用中,但通常这不是必需的:

    voting = get_object_or_404(Voting, **{to_attribute(name='slug', language_code=request.LANGUAGE_CODE): slug})

您可以使用
to_属性
*
在一行中使用
语言_代码
。在这种情况下,您不必像以前那样定义它5次。类似于
get\u object\u或\u 404(投票,**{to\u属性(name='slug'):slug})
如果需要,您可以将
language\u code=request.language\u code
添加到
to\u属性的调用中。感谢您提供了此解决方案:-)