如何本地化django_tables2列名?

0 投票
3 回答
1259 浏览
提问于 2025-04-18 08:16

我在我的网页上使用了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 个回答

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"))
1

class patchTable(tables.Table): 下面,请添加以下内容:

def __init__(self, *args, **kwargs):
        super(patchTable, self).__init__(*args, **kwargs)

__init__ 是一个构造函数,也就是说,当这个类被调用的时候,就会创建这个类的一个对象。具体细节可以查看 这里

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() 是一个函数,它返回的是翻译后的字符串,格式是键值对。这里的键就是列名,值则是对应的翻译字符串(根据选择的语言会有所变化)。verbose name 是由 test() 这个类定义的,它为每个新对象初始化列名。使用 initunicode 让我解决了这个问题。

感谢 @ruddra 和 @VikasVerma,你们的建议对我很有帮助。

撰写回答