[英]django translate model choices
我需要翻譯模型上字段的選擇。 我有這樣的事情:
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'] 不存在。
任何幫助將不勝感激。
謝謝...
在models.py中,你需要
from django.utils.translation import ugettext_lazy as _
ugettext_lazy 將返回一個可調用的而不是翻譯后的字符串。 稍后評估可調用對象時,它將返回翻譯后的字符串。 它會為視圖/模板處理獲得正確的語言已經足夠晚了。
請參閱https://docs.djangoproject.com/en/dev/topics/i18n/translation/#lazy-translations 。
下一部分不是您的問題,而是:在 django 中,您應該使用表單來處理用戶輸入,而不是直接從 request.POST.get 訪問它。 這是一個完全不同的話題,但我不能讓它在這個答案中無人問津,因為擔心其他人可能會使用這種方法。
這是一個用於翻譯您保存在數據庫中的值的示例。
#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)
我想我遲到了,但我剛剛解決了一個類似的問題。 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,)
見鏈接
或者。
.
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
單擊替代語言鏈接
模型.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)
表格.py
CATEGORIES = (
('LAB', 'labor'),
('CAR', 'cars'),
('TRU', 'trucks'),
('WRI', 'writing'),
)
category = forms.ChoiceField(choices=CATEGORIES, required=True)
類別.html
<!-- category -->
<div class="fieldWrapper">
{{ form.category.errors }}
<label for="id_category">Category</label>
{{ form.category }}
</div>
<!-- location -->
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.