Django 1.8.5. How to define user language in Model.Admin in admin.py of my application using get_language ()?

I want to create a package for django in three languages. And I need to show data from db to administrator depending on its 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 unfinished 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())

Thus, the get_language () method works correctly in the author () phrase and the content () phrase. I need to change the fields and phrase_author.admin_order_field depending on the user's language, but it returns the default value of "en-us", not current. Maybe I should use a different method? Or what am I doing wrong? For example, I want to do the following:

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]
+4
source share
1

:

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)
+3

Source: https://habr.com/ru/post/1621248/


All Articles