django翻译模型选择

时间:2013-11-27 03:26:20

标签: python django django-models

我需要为模型上的字段翻译选项。 我有这样的事情:

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上调用TYPES时,因为request.session ['django_language']不存在。

非常感谢任何帮助。

...谢谢

4 个答案:

答案 0 :(得分:14)

在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访问它。这是另一个主题,但我不能在这个答案中解决它,因为担心其他人可能会使用这种方法。

答案 1 :(得分:1)

<强> models.py

CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)


class PostAd(models.Model):  
    name = models.CharField(max_length=50)
    email = models.EmailField()
    gist = models.CharField(max_length=50)
    category = models.CharField(max_length=3, choices=CATEGORIES)

<强> forms.py

CATEGORIES = (  
    ('LAB', 'labor'),
    ('CAR', 'cars'),
    ('TRU', 'trucks'),
    ('WRI', 'writing'),
)

category = forms.ChoiceField(choices=CATEGORIES, required=True)

<强> category.html

<!-- category -->
<div class="fieldWrapper">
    {{ form.category.errors }}
    <label for="id_category">Category</label>
    {{ form.category }}
</div>
<!-- location -->

答案 2 :(得分:1)

这是一个翻译您保存在数据库中的值的示例。

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

答案 3 :(得分:0)

我想我参加聚会迟到了,但是我已经解决了一个类似的问题。 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

或者。

  1. 像这样在app文件夹中部署枚举(enums.py):

from enum import Enum, unique
from django.utils.translation import gettext_lazy as _
@unique class SomeChoice(Enum):
  first = _('First Option')
  second = _('Second Option')

很显然,您随后将枚举导入模型并根据需要使用。 例如

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

点击备用语言链接