首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django翻译模型选择

django翻译模型选择
EN

Stack Overflow用户
提问于 2013-11-27 11:26:20
回答 4查看 8.1K关注 0票数 11

我需要在模型上翻译一个字段的选择。我有这样的东西:

代码语言:javascript
复制
from django.utils.translation import ugettext as _
from django.db import models

class MyModel(models.Model):
    TYPES = (
        (1, _("Option one")),
        (2, _("Option two"))
        (3, _("Option three"))
    )
    type = models.CharField(max_length=50, choices=TYPES)

在此之前,我在登录视图上有一个脚本:

代码语言:javascript
复制
request.session['django_language'] = request.POST.get("language")

所以,问题出在django调用MyModel上的类型时,因为request.session'django_language‘不存在。

EN

回答 4

Stack Overflow用户

发布于 2013-12-28 12:18:12

在models.py中,您需要

代码语言:javascript
复制
from django.utils.translation import ugettext_lazy as _

ugettext_lazy将返回一个可调用的字符串,而不是翻译后的字符串。当稍后计算callable时,它将返回翻译后的字符串。为时已晚,它将获得用于视图/模板处理的正确语言。

参见https://docs.djangoproject.com/en/dev/topics/i18n/translation/#lazy-translations

下一部分不是您的问题,但是:在django中,您应该使用表单来处理用户输入,而不是直接从request.POST.get访问它。这是一个完全不同的话题,但我不能不在这个答案中解决这个问题,因为我担心其他人可能会使用这种方法。

票数 19
EN

Stack Overflow用户

发布于 2021-02-19 12:13:20

下面是一个转换保存在数据库中的值的示例。

代码语言:javascript
复制
#models.py

from django.db import models
from django.utils.translation import gettext_noop


CATEGORY_CHOICE = (
  ("choice one", gettext_noop("choice one")) # gettext_noop will mark the string to be translated when you later do "python3 manage.py makemessages"
  ("choice two", gettext_noop("choice two"))
)

class Foo(models.Model)
  category = models.CharField(choices=CATEGORY_CHOICES, max_length=50)

只需执行python3 manage.py makemessages以生成区域设置的django.po文件,然后输入翻译。然后,使用python3 manage.py compilemessages来编译您的语言环境文件。

现在,在从视图或api返回此字段时,只需确保执行以下操作:

代码语言:javascript
复制
#views.py

from django.utils.translation import ugettext as _

def get_category():
  foo = Foo.objects.get(id=1)
  return _(foo.category)
票数 1
EN

Stack Overflow用户

发布于 2020-12-05 22:33:59

我想我来晚了,但我刚刚解决了一个类似的问题。在django文档中有一个非常好的解决方案。

代码语言:javascript
复制
from django.utils.translation import gettext_lazy as _
class Student(models.Model):
    class YearInSchool(models.TextChoices):
        FRESHMAN = 'FR', _('Freshman')
        SOPHOMORE = 'SO', _('Sophomore')
        JUNIOR = 'JR', _('Junior')
        SENIOR = 'SR', _('Senior')
        GRADUATE = 'GR', _('Graduate')

    year_in_school = models.CharField(max_length=2, choices=YearInSchool.choices, default=YearInSchool.FRESHMAN,)

请参阅LINK

另一种选择。

应用程序文件夹中的

  1. Deploy enums (enums.py),如下所示:

代码语言:javascript
复制
from enum import Enum, unique
from django.utils.translation import gettext_lazy as _
@unique class SomeChoice(Enum):
  first = _('First Option')
  second = _('Second Option')

显然,您将把枚举导入到您的模型中,并根据需要使用它。e.g

代码语言:javascript
复制
name = models.CharField(max_length=30, db_index=True, choices=[(s.name, s.value) for s in SomeChoice])

在这个阶段,我假设您已经编写了语言环境文件,所以您已经设置好了.po文件。

代码语言:javascript
复制
#Append your translation content within .po | or via rosetta app

django-admin makemessages -all

django-admin compilemessages

单击备用语言链接

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20233319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档