4

I want to create a package for django on three languages. And I need to show data from db to admin depending on his language. My model:

class Author(models.Model):
    name_en = models.CharField(max_length=200, default='No name')
    name_ua = models.CharField(max_length=200, default='No name')
    name_ru = models.CharField(max_length=200, default='No name')
    biography_en = models.TextField(default='No biography')
    biography_ua = models.TextField(default='No biography')
    biography_ru = models.TextField(default='No biography')

    def __str__(self):
        lang = get_language()
        if lang == 'ru':
            author = self.name_ru
        elif lang == 'ua':
            author = self.name_ua
        else:
            author = self.name_en
        return author 

class Phrases(models.Model):
    phrase_en = models.TextField(default='No phrase')
    phrase_ua = models.TextField(default='No phrase')
    phrase_ru = models.TextField(default='No phrase')
    author = models.ForeignKey(Author)
    PHRASE_STATUS = (
        ('published', 'Published'),
        ('draft', 'Draft'),
        ('unpublished', 'Unpublished'),
    )
    showed = models.BooleanField(default=False)
    phrase_status = models.CharField(max_length=11, choices=PHRASE_STATUS, default='published')
    pub_date = models.DateTimeField('Date published', auto_now_add=True)

    def __str__(self):
        return ''.join([self.phrase_en[:30], '...'])

And here is my not finished admin.py

from django.utils.translation import get_language

class PhilosophyAllPhrases(admin.ModelAdmin):
    model = Phrases
    actions_on_bottom = True
    actions_on_top = True
    actions_selection_counter = True
    date_hierarchy = 'pub_date'
    lang = get_language()
    fieldsets = [
        (
            'English', {
                'fields': ['phrase_en'],
                'classes': ['collapses']
            }
        ), (
            'Russian', {
                'fields': ['phrase_ru'],
                'classes': ['collapses']
            }
        ), (
            'Ukraine', {
                'fields': ['phrase_ua'],
                'classes': ['collapses']
            }
        ), (
            'Settings', {
                'fields': ['author', 'phrase_status']
            }
        )
    ]
    list_display = ('phrase_content', 'phrase_author', 'phrase_status')

    def phrase_author(self, obj):
        self.lang = get_language()
        if self.lang == 'ru':
            author = obj.author.name_ru
        elif self.lang == 'ua':
            author = obj.author.name_ua
        else:
            author = obj.author.name_en
        return format_html('<span class="pp_author">%s</span>' % author)

    def phrase_content(self, obj):
        self.lang = get_language()
        if self.lang == 'ru':
            phrase = obj.phrase_ru
        elif self.lang == 'ua':
            phrase = obj.phrase_ua
        else:
            phrase = obj.phrase_en
        return format_html(('%s...' % phrase[:100]).upper())

So the method get_language() is working properly in the phrase_author(), and phrase_content(). I need to change fieldsets and phrase_author.admin_order_field depending on user language but it returns the default 'en-us', not current. May be I must to use another method? Or what I'm doing wrong? For example I want to do like this:

lang = get_language()
if lang == 'ru':
    phrase = (
        'Фраза', {
            'fields': ['phrase_ru'],
            'classes': ['collapses']
        }
    )
elif lang == 'en':
    phrase = (
        'Phrase', {
            'fields': ['phrase_en'],
            'classes': ['collapses']
        }
    )
settings = (
    'Settings', {
        'fields': ['author', 'phrase_status']
    }
)
fieldsets = [phrase, settings]
Ivan
  • 43
  • 6
  • 1
    Possible duplicate of [Django internationalization minimal example](http://stackoverflow.com/questions/16768809/django-internationalization-minimal-example). This is called in Django [internationalization](https://docs.djangoproject.com/en/1.9/topics/i18n/) – Dhia Dec 22 '15 at 09:59
  • I need to use some function like get_language() in my class which extends admin.ModelAdmin , so that django builds table of editing on right language. Just like I'm doing it in list_display. But get_language() not working properly in class. I don't know why. As an example in PhilosophyAllPhrases.phrase_author() get_language() returns 'ru', but in PhilosophyAllPhrases() it returns 'en-us' as it set in settings of project. – Ivan Dec 22 '15 at 10:55

1 Answers1

3

See the code below:

from django.utils.translation import get_language_from_request

class RecordAdmin(admin.ModelAdmin):

  def changelist_view(self, request, extra_context=None):
    self.lng_id = get_language_from_request(request)
    return super(RecordAdmin, self).changelist_view(request, extra_context=extra_context)
Nemo
  • 46
  • 4
  • Thanks, but I'm using get_language() instead of get_language_from_request(request), because if I turn off 'django.middleware.locale.LocaleMiddleware', it will be different of whole admin part. And I need it like admin part. And use self.list_display inside changelist_view. – Ivan Dec 24 '15 at 13:46