1

I'm working on a multi language application in Django with django-hvad.

I've two models, Category and Post for a Blog app:

class Category(TranslatableModel):
    translations = TranslatedFields(
        name=models.CharField(
            max_length=100,
            verbose_name=_(u'Nombre')
        )
    )
    slug = AutoSlugField(
        populate_from='name'
    )

    class Meta:
        verbose_name = _(u'Categoría')
        verbose_name_plural = _(u'Categorías')

    def __unicode__(self):
        return self.safe_translation_getter('name', str(self.pk))


class Post(TranslatableModel):
    category = models.ForeignKey(
        Category,
        related_name='posts',
        verbose_name=_(u'Categoría')
    )
    slug = AutoSlugField(
        populate_from='title'
    )

    translations = TranslatedFields(
        title=models.CharField(
            max_length=100,
            verbose_name=_(u'Título')
        ),
        content=RichTextField(
            verbose_name=_(u'Contenido')
        )
    )

    class Meta:
        verbose_name = _(u'Publicación')
        verbose_name_plural = _(u'Publicaciones')
        ordering = ['-created']

    def __unicode__(self):
        return self.safe_translation_getter('title', str(self.pk))

In my admin.py I'm registering my models this way:

from django.contrib import admin
from hvad.admin import TranslatableAdmin
from blog.models import Category, Post


class CategoryAdmin(TranslatableAdmin):
    pass

admin.site.register(Category, CategoryAdmin)


class PostAdmin(TranslatableAdmin):
    pass

admin.site.register(Post, PostAdmin)

When I'm creating a new Post in the admin interface I'm having Category IDs instead of their names in the category dropdown:

Creating Post in admin interface

What should I do to have the translated name instead of the ID?

Community
  • 1
  • 1
Cristian Rojas
  • 2,746
  • 7
  • 33
  • 42
  • You need to implement `label_from_instance`, similar [question](https://stackoverflow.com/questions/6836740/django-admin-change-foreignkey-display-text) – Kracekumar Apr 28 '15 at 05:26
  • Issue here is your `__unicode__` gets called, checks whether it has a translation loaded, and never has so it will just return the id. A simple fix would be to change `safe_translation_getter` to `lazy_translation_getter`. That will generate a lot of queries though. For a more general solution, you have to ask yourself what languages should appear in there and supply a custom queryset. – spectras May 11 '15 at 03:28

0 Answers0