Django:在模型选择中将惰性翻译与标记安全相结合

Posted

技术标签:

【中文标题】Django:在模型选择中将惰性翻译与标记安全相结合【英文标题】:Django: combine lazy translation with mark safe in model choices 【发布时间】:2013-02-08 05:28:42 【问题描述】:

是的,所以,我想为我的模型存储翻译后的选择,但 Django 在这方面不同意我的看法。 Django 的版本是 1.3,模型和选项如下所示:

from django.db import models
from django.utils.safestring import mark_safe          
from django.utils.translation import ugettext_lazy as _

RATE_CHOICES = (
    ('', _('Choose service rate')),
    ('5cpm_EUR', mark_safe(string_concat('€ 0,05 ', _('per minute')))),
    ('1cpm_EUR', mark_safe(string_concat('€ 0,01 ', _('per minute')))),
)

class Product(models.Model):
    service_rate = models.CharField(_('service rate'), max_length=10, blank=True, choices=RATE_CHOICES)

此外,这些选项在模型表单中使用(对于另一个模型,所以我不得不重新声明该字段),如下所示:

service_rate = forms.ChoiceField(choices=RATE_CHOICES, widget=forms.Select(attrs='class': 'chzn-select rate-select'), required=False)

问题是,无论我尝试什么;遵循 django docs 上的内容,颠倒 mark_safe 和翻译的顺序,不使用惰性翻译等。它总是归结为 mark_safe 工作或翻译工作。但绝不会两者兼而有之……

如何正确组合这两个功能?

【问题讨论】:

【参考方案1】:

添加:

from django.utils import six  # Python 3 compatibility
from django.utils.functional import lazy
from django.utils.safestring import mark_safe
from django.utils.translation import ugettext_lazy as _

mark_safe_lazy = lazy(mark_safe, six.text_type)

然后:

mark_safe_lazy(string_concat('€ 0,05 ', _('per minute')))

这已添加到 Django 1.4 docs。

【讨论】:

运行 django 1.3,虽然我已经尝试过,但我无法让它工作。

以上是关于Django:在模型选择中将惰性翻译与标记安全相结合的主要内容,如果未能解决你的问题,请参考以下文章

Django模型类查询的惰性求值

Django模型类查询的惰性求值

如何在 django 中将模型与不同的应用程序相乘?

在Django中将计算值从视图保存到模型

Django Migrations ValueError: [...] 是用对 [...] 的惰性引用声明的

将 json 模型字段与 django 石墨烯一起使用