Como fazer a chave estrangeira ContentType i18n?
-
29-10-2019 - |
Pergunta
Estou desenvolvendo um aplicativo multilíngue usando Django. Uma parte é selecionar o tipo de algo usando a API ContentType.
Conforme descrito no documento, o nome do objeto ContentType é extraído de verbose_name.
No meu caso, o verbose_name é traduzido usando xgettext_lazy
, mas como é copiado no banco de dados durante o syncdb
, não há tradução para ContentType, o verbose_name não é traduzido.
Eu gostaria de poder alterar a maneira como a chave estrangeira é exibida em um formulário.
Você tem ideia de como posso fazer isso?
Saúde,
Natim
Solução 2
Finalmente, aqui está a solução que encontrei:
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)
Outras dicas
Você precisa usar ugettext_lazy em vez de ugettext, e ele não é armazenado no banco de dados, mas está em alguns arquivos .po.Por exemplo:
from django.utils.translation import ugettext_lazy as _
class Event(models.Model):
...
class Meta:
verbose_name = _(u'Event')
verbose_name_plural = _(u'Events')
Para blocos de código que são carregados no momento da importação, você precisa usar ugettext_lazy, e para aqueles que são carregados no tempo de execução, você precisa do ugettext.Depois de ter isso, você só precisa fazer um "python manage.py makemessages" e "python manage.py compilemessages"