我需要在模型上翻译一个字段的选择。我有这样的东西:
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)在此之前,我在登录视图上有一个脚本:
request.session['django_language'] = request.POST.get("language")所以,问题出在django调用MyModel上的类型时,因为request.session'django_language‘不存在。
发布于 2013-12-28 12:18:12
在models.py中,您需要
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访问它。这是一个完全不同的话题,但我不能不在这个答案中解决这个问题,因为我担心其他人可能会使用这种方法。
发布于 2021-02-19 12:13:20
下面是一个转换保存在数据库中的值的示例。
#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返回此字段时,只需确保执行以下操作:
#views.py
from django.utils.translation import ugettext as _
def get_category():
foo = Foo.objects.get(id=1)
return _(foo.category)发布于 2020-12-05 22:33:59
我想我来晚了,但我刚刚解决了一个类似的问题。在django文档中有一个非常好的解决方案。
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
另一种选择。
应用程序文件夹中的
。
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
name = models.CharField(max_length=30, db_index=True, choices=[(s.name, s.value) for s in SomeChoice])在这个阶段,我假设您已经编写了语言环境文件,所以您已经设置好了.po文件。
#Append your translation content within .po | or via rosetta app
django-admin makemessages -all
django-admin compilemessages单击备用语言链接
https://stackoverflow.com/questions/20233319
复制相似问题