我正在使用 Django 开发一个多语言应用程序。一部分是使用 ContentType API 选择某物的类型。
如文档中所述,ContentType 对象名称是从 verbose_name 中提取的。
在我的情况下,verbose_name 是使用翻译的,xgettext_lazy但由于它在 期间复制到数据库中syncdb,因此 ContentType 没有翻译,verbose_name 没有翻译。
我希望能够更改外键在表单中的显示方式。
你知道我该怎么做吗?
干杯,
纳提姆
我正在使用 Django 开发一个多语言应用程序。一部分是使用 ContentType API 选择某物的类型。
如文档中所述,ContentType 对象名称是从 verbose_name 中提取的。
在我的情况下,verbose_name 是使用翻译的,xgettext_lazy但由于它在 期间复制到数据库中syncdb,因此 ContentType 没有翻译,verbose_name 没有翻译。
我希望能够更改外键在表单中的显示方式。
你知道我该怎么做吗?
干杯,
纳提姆
您需要使用 ugettext_lazy 而不是 ugettext,它不存储在数据库中,而是在一些 .po 文件中。例如:
from django.utils.translation import ugettext_lazy as _
class Event(models.Model):
...
class Meta:
verbose_name = _(u'Event')
verbose_name_plural = _(u'Events')
对于在导入时加载的代码块,您需要使用 ugettext_lazy,对于在执行时加载的代码块,您需要使用 ugettext。一旦你有了它,你只需要做一个“python manage.py makemessages”和“python manage.py compilemessages”
最后这是我找到的解决方案:
def content_type_choices(**kwargs):
content_types = []
for content_type in ContentType.objects.filter(**kwargs):
content_types.append((content_type.pk, content_type.model_class()._meta.verbose_name))
return content_types
LIMIT_CHOICES_TO = {'model__startswith': 'pageapp_'}
class PageWAForm(forms.ModelForm):
app_page_type = forms.ModelChoiceField(queryset=ContentType.objects.filter(**LIMIT_CHOICES_TO),
empty_label=None)
def __init__(self, *args, **kwargs):
super(PageWAForm, self).__init__(*args, **kwargs)
self.fields['app_page_type'].choices = content_type_choices(**LIMIT_CHOICES_TO)