【问题标题】:Django 1.8.5. How can I define the user language in Model.Admin in the admin.py of my app using get_language()?Django 1.8.5。如何使用 get_language() 在我的应用程序的 admin.py 中定义 Model.Admin 中的用户语言?
【发布时间】:2015-12-22 09:36:40
【问题描述】:

我想为三种语言的 django 创建一个包。而且我需要根据他的语言将数据从 db 显示给 admin。 我的模型:

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

这是我未完成的 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())

因此get_language() 方法在phrase_author() 和phrase_content() 中正常工作。我需要根据用户语言更改字段集和短语_author.admin_order_field,但它返回默认的“en-us”,而不是当前的。 可能我必须使用另一种方法吗?或者我做错了什么? 例如我想这样做:

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]

【问题讨论】:

  • Django internationalization minimal example 的可能重复项。这是在 Django internationalization 中调用的
  • 我需要在我的类中使用一些类似 get_language() 的函数来扩展 admin.ModelAdmin ,以便 django 以正确的语言构建编辑表。就像我在 list_display 中做的一样。但是 get_language() 在课堂上无法正常工作。我不知道为什么。作为 PhilosophyAllPhrases.phrase_author() 中的示例,get_language() 返回“ru”,但在 PhilosophyAllPhrases() 中,它返回“en-us”,因为它在项目设置中设置。

标签: python django internationalization


【解决方案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)

【讨论】:

  • 谢谢,但我使用的是 get_language() 而不是 get_language_from_request(request),因为如果我关闭 'django.middleware.locale.LocaleMiddleware',它将与整个管理部分不同。我需要它,就像管理部分一样。并在 changelist_view 中使用 self.list_display。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2013-06-10
  • 2016-11-25
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 2013-09-02
  • 2012-10-06
相关资源
最近更新 更多