【发布时间】: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