我正在使用Django开发一个多语言应用程序。 一部分是使用ContentType API选择某种类型。
如文档中所述,ContentType对象名称是从verbose_name中提取的。
在我的情况下,verbose_name是使用xgettext_lazy
翻译的,但由于它在syncdb
期间在数据库中被复制,因此没有ContentType的翻译,verbose_name未被翻译。
我希望能够改变外键在表单中的显示方式。
你知道我该怎么做吗?
干杯,
Natim
答案 0 :(得分:0)
你需要使用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”
答案 1 :(得分:0)
最后,我找到了解决方案:
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)