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

Foi útil?

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"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top