Django的Verbose Name和翻译

3

请问以下方法的翻译是否存在问题?

我担心verbose name在数据库迁移时会变得固定。

models.py

from django.utils.translation import gettext as _
class UserClient(models.Model):
    user             = models.OneToOneField(User,related_name='profile_client')
    phone_cell       = PhoneNumberField(verbose_name=_(u'Phone (Cell)'),null=True,blank=False)
    phone_home       = PhoneNumberField(verbose_name_(u'Phone (Home)'),null=True,blank=True)

如果上述方法存在问题,是否最好实施以下方法?
forms.py
class ClientForm(forms.ModelForm):
    def __init__(self,*args,**kwargs):
        super(ClientForm,self).__init__(*args,**kwargs)
        self.fields['phone_cell'].label = _(u'Phone (Cell)')
        self.fields['phone_home'].label = _(u'Phone (Home)')
1个回答

12

只要您使用gettext的懒惰版本,那么models.py中的方法将正确运行:

from django.utils.translation import ugettext_lazy as _

class UserClient(models.Model):
    phone_cell = PhoneNumberField(verbose_name=_('Phone (Cell)'), ...)
    ...

实际上,Django自己的模型也使用了相同的翻译技术-可以查看AbstractUser类。您可以确定这种方法会正常工作。

尽管数据库迁移中存在verbose_name,但它并未被使用。任何依赖于verbose_name的代码都将直接从模型中检索它。例如,ModelForm字段的默认标签将使用模型的verbose_name,并且由于翻译是惰性的,实际标签将在评估时进行翻译(例如在模板上呈现)。


谢谢。那么,ugettext_lazy应该始终优先使用,是吗?使用非lazy方法有什么优势吗? - Nicholas Hamilton
2
@NicholasHamilton 这个答案总结得非常好:https://dev59.com/EW855IYBdhLWcg3wJQzT#4510998 - Bjorn
@Bjorn 谢谢你提供的链接!这是一个非常好的解释,介绍了惰性与非惰性之间的区别。 - Derek Kwok
这很有帮助,我猜我的问题(我知道这会偏离主题)是,为什么要使用非惰性加载方法?惰性加载是否存在性能成本? - Nicholas Hamilton
@NicholasHamilton 它可以防止循环引用,计算时间仅仅是被转移了,所以在我看来性能不是一个大问题。 - Daniel W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接