django-modeltranslation
django-modeltranslation copied to clipboard
Group translation field for list-display (+ proposal)
I've noticed that it can be very confusing when fields are translated but the list-display in admin only shows one field in the current language.
I thought to render the joined values within a single column and it works for me on boolean fields and simple integer fields, i can imagine it's not useful for larger text fields as the content quickly explodes.

The code:
from django.conf import settings from django.contrib.admin.utils import lookup_field, display_for_value from django.db.models import BooleanField from django.utils.html import format_html
from apps.utils import languify_translation_field
class GroupTranslationAdminMixin(object): list_display_grouped = ()
def __init__(self, *args, **kwargs):
super(GroupTranslationAdminMixin, self).__init__(*args, **kwargs)
self._patch_grouped()
def _patch_grouped(self):
display_new = list(self.list_display)
for field in self.list_display_grouped:
if field in self.trans_opts.fields:
display_index = display_new.index(field)
display_new[display_index] = self.GroupTranslationField(field)
self.list_display = display_new
class GroupTranslationField(object):
def __init__(self, field):
self.field = field
self.allow_tags = True
self.short_description = '{f} [{l}]'.format(f=self.field, l=u'/'.join(settings.LANGUAGE_CODES))
def __call__(self, obj, *args, **kwargs):
f, attr, value = lookup_field(self.field, obj)
return format_html(u' / '.join([
display_for_value(
getattr(obj, languify_translation_field(self.field, l)), u'-', boolean=isinstance(f, BooleanField)
) for l in settings.LANGUAGE_CODES
]))
def __name__(self):
return self.short_description
And how to use:
class MyAdmin(GroupTranslationAdminMixin, TranslationAdmin): list_display = ( 'listing_title', 'enabled', 'blog_page', 'order',) list_display_grouped = ( 'enabled', 'blog_page', )