我在网页上使用了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方法中,我正在“从myapp.tables导入patchTable”,然后更新表格内容,分页和渲染到模板。
上面的代码工作正常,并以当前正在使用的语言显示列名(在runserver命令期间)。但是,如果我更改HTML页面上的语言选择,页面上的所有其他内容都会被翻译,但此表的列名不会。
如果我重新启动django服务器(cntrl + 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”。 任何帮助,将不胜感激。如果这个问题需要更多细节,请告诉我。提前谢谢。
答案 0 :(得分:1)
在class patchTable(tables.Table):
下,请添加:
def __init__(self, *args, **kwargs):
super(patchTable, self).__init__(*args, **kwargs)
__init__
是一个构造函数,因此在调用类时,将创建该类的对象。详情here。
答案 1 :(得分:1)
我重新编写了代码,
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()是一个将已翻译的字符串作为键值对返回的函数。键只是列名,值是它们各自的翻译字符串(语言选择的变化)。 详细名称由类test()定义,它初始化每个新对象的列名。 unicode 的 init 帮助我解决了这个问题。
感谢@ruddra和@VikasVerma,您的建议帮助了我。
答案 2 :(得分:1)
基于模型的表的一般解决方案:
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"))