如何本地化django_tables2列名?
我在我的网页上使用了django_tables2来显示一个表格。
这个表格的代码在tables.py文件里:
import django_tables2 as tables
from django.utils.translation import ugettext_lazy
from django.utils.encoding import force_text
class patchTable(tables.Table):
release_version=tables.Column(verbose_name=force_text(ugettext_lazy("Release Version"),orderable=False, localize=True)
patch_version=tables.Column(verbose_name=force_text(ugettext_lazy("Patch Version")),orderable=False, localize=True)
release_date = tables.Column(verbose_name=force_text(ugettext_lazy("Release Date")),orderable=False, localize=True)
upload_date = tables.Column(verbose_name=force_text(ugettext_lazy("Upload Date")),orderable=False, localize=True)
apply_status = tables.Column(verbose_name=force_text(ugettext_lazy("Status")),orderable=False, localize=True)
installation_date = tables.Column(verbose_name=force_text(ugettext_lazy("Installation Date")),orderable=False, localize=True)
在我的views.py文件中,我用“from myapp.tables import patchTable”来导入这个表格,然后更新表格内容、进行分页,并渲染到一个模板上。
上面的代码运行得很好,表格的列名会显示我当前使用的语言(在运行服务器命令时)。但是,如果我在HTML页面上更改语言选择,页面上的其他内容都会翻译成新语言,但这个表格的列名却没有变化。
如果我重启django服务器(按Ctrl+C,然后输入python2.7 manage runserver 0.0.0.0:8060),这些列名就会变成当前语言,但在选择语言时并不会动态更新。
我尝试了以下方法:1) “ugettext” 2) “ugettext_lazy”(这个方法报错:‘懒对象返回了意外的类型’)3) “force_text”和“ugettext_lazy”的组合。但这些方法都没有效果。有没有人能给我一个可行的解决办法?
顺便说一下,我使用的是Python 2.7,Django 1.5.1和Django开发服务器。所有本地化设置的要求都包含在项目中,settings.py里有“USE_L10N = True”和“USE_I18N = True”。
任何帮助都将不胜感激。如果这个问题需要更多细节,请告诉我。提前感谢!
3 个回答
这是一个关于基于模型的表格的一般解决方案:
class TranslatedTable(tables.Table):
def __init__(self, *args, **kwargs):
super(TranslatedTable, self).__init__(*args, **kwargs)
for column in self.base_columns:
self.base_columns[column].verbose_name = \
self.Meta.model._meta.get_field(column).verbose_name
表格的列标题会由相应字段的 verbose_name
来定义,并且会进行适当的翻译。需要注意的是,这里的 verbose_name
在模型定义时应该加上翻译的标记,比如:
from django.db import models
from django.utils.translation import ugettext_lazy as _
class SomeModel(models.Model):
name = models.CharField(max_length=100, verbose_name=_("Name"))
在 class patchTable(tables.Table):
下面,请添加以下内容:
def __init__(self, *args, **kwargs):
super(patchTable, self).__init__(*args, **kwargs)
__init__
是一个构造函数,也就是说,当这个类被调用的时候,就会创建这个类的一个对象。具体细节可以查看 这里。
我把代码重新写成了这样,
class test():
_name = None
def __init__(self, name):
self._name = name
def __unicode__(self):
english_string = get_string()
params = {}
params = deepcopy(english_string)
var = force_text(params['patch_text'][self._name])
return unicode(var )
class patchTable(tables.Table):
release_version = tables.Column(verbose_name=test('release_version'),orderable=False)
patch_version = tables.Column(verbose_name=test('patch_version'),orderable=False)
release_date = tables.Column(verbose_name=test('release_date'),orderable=False)
upload_date = tables.Column(verbose_name=test('upload_date'),orderable=False)
apply_status = tables.Column(verbose_name=test('status'),orderable=False)
installation_date = tables.Column(verbose_name=test('installation_date'),orderable=False)
class Meta:
attrs = {"class": "paleblue", "id":"patch_details", "style":"cursor: pointer;"}
orderable = False
get_string() 是一个函数,它返回的是翻译后的字符串,格式是键值对。这里的键就是列名,值则是对应的翻译字符串(根据选择的语言会有所变化)。verbose name 是由 test() 这个类定义的,它为每个新对象初始化列名。使用 init 和 unicode 让我解决了这个问题。
感谢 @ruddra 和 @VikasVerma,你们的建议对我很有帮助。