簡體   English   中英

django 翻譯模型選擇

[英]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,)

鏈接

或者。

  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

單擊替代語言鏈接

模型.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM