django-modeltranslation icon indicating copy to clipboard operation
django-modeltranslation copied to clipboard

Group translation field for list-display (+ proposal)

Open Paul424 opened this issue 8 years ago • 0 comments

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.

selection_132

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', )

Paul424 avatar Oct 30 '17 16:10 Paul424