Python django翻译模型选择
我需要为模型上的字段转换一个选项。 我有这样的想法:Python django翻译模型选择,python,django,django-models,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")) )
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']不存在
任何帮助都将不胜感激
谢谢…在models.py中,您需要
from django.utils.translation import ugettext_lazy as _
ugettext_lazy将返回可调用的字符串,而不是已翻译的字符串。稍后计算callable时,它将返回已翻译的字符串。这将足够晚,它将获得视图/模板处理的正确语言
看
下一部分不是您的问题,而是:在django中,您应该使用表单来处理用户输入,而不是直接从request.POST.get访问它。这是一个完全不同的话题,但我不能让它在这个答案中不被提及,因为我担心其他人可能会使用这种方法。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)
CATEGORIES = (
('LAB', 'labor'),
('CAR', 'cars'),
('TRU', 'trucks'),
('WRI', 'writing'),
)
category = forms.ChoiceField(choices=CATEGORIES, required=True)
forms.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)
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 -->
{{form.category.errors}
类别
{{form.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,)
看
或者
#Append your translation content within .po | or via rosetta app
django-admin makemessages -all
django-admin compilemessages
单击替代语言链接这里是一个转换保存在数据库中的值的示例
#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)
我想澄清一下:您已经编写了一个使用request.POST.get(“语言”)值的视图,并且您没有使用django表单来管理输入?您试图在会话中分配给“django_language”,但失败了?请显示整个视图功能,并粘贴您得到的实际错误。我将尝试澄清。我执行这一行:
request.session['django_language']=request.POST.get(“语言”)
当用户启动会话时,django在英语和西班牙语之间切换。对于我使用的所有模板,{%trans“Hello”%}
都被翻译。但pyhon在此之前“编译”了所有模型。因此,类属性不会实时进行翻译。唯一的方法是更改配置文件中的语言选项,但需要重新启动服务器。所有模型的示例都显示了选项,使用的方式与我的相同。虽然这个代码片段可以解决这个问题,但确实有助于提高您文章的质量。请记住,您将在将来为读者回答此问题,而这些人可能不知道您的代码建议的原因。此答案似乎无法解决此问题,因为它不包含任何翻译。唯一对我有帮助的答案是,因为它包含视图示例!