我必须管理不同语言的记录,注册用户在线编辑内容,而不使用Django管理工具。
表格必须以每种语言进行本地化。
由于语言数量是固定的,我决定使用模型中的不同字段处理不同的语言,并使用语言代码完成字段的名称,参见下面的示例。
# models.py
class MyAttribute(models.Model):
name_en = models.CharField() # name in English
name_es = models.CharField() # name in Spanish
name_fr = models.CharField() # name in French
field2_en = models.CharField() # field2 in English
field2_es = models.CharField() # field2 in Spanish
field2_fr = models.CharField() # field2 in French
class MyGroup(models.Model):
name_en = models.CharField() # name in English
name_es = models.CharField() # name in Spanish
name_fr = models.CharField() # name in French
myattribute = models.ForeignKey(MyAttribute)
我已经创建了一个自定义标记来处理模板中本地化内容的显示,但效果很好。
{% localized_value mygroup name current_language %}
现在我需要设置一个表单来编辑MyGroup对象,并为myattribute字段添加 models.ModelChoiceField 。我的理解是,默认情况下,这将始终显示由Model中的label_from_instance()生成的相同字符串,并且无法在那里使用request.LANGUAGE_CODE。
所以我的问题是:如何能够动态选择要在我的表单中显示的好name_language_code字段?
实施可能类似于:
# views.py
form.fields["myattribute"].related_field = eval('name_' + language_code)
或
# template.html
{{ form.myattribute language_code }}
任何想法?
btw,使用Django 1.6
答案 0 :(得分:1)
老兄,如果你想翻译一下所谓的verbose_name,理想情况下你要使用django国际化。
以下链接中的文档:https://docs.djangoproject.com/en/dev/topics/i18n/translation/
答案 1 :(得分:1)
我终于找到了一种方法,使用Beau Simensen描述的工作:http://srcmvn.com/blog/2013/01/15/django-advanced-model-choice-field/修改了 ModelChoiceField 来返回(value,label,model)而不是(value,label)。< / p>
到目前为止,似乎对我有用。
from django.forms import models
from django.forms.fields import ChoiceField
class AdvancedModelChoiceIterator(models.ModelChoiceIterator):
def choice(self, obj):
return (self.field.prepare_value(obj), self.field.label_from_instance(obj), obj)
class AdvancedModelChoiceField(models.ModelChoiceField):
def _get_choices(self):
if hasattr(self, '_choices'):
return self._choices
return AdvancedModelChoiceIterator(self)
choices = property(_get_choices, ChoiceField._set_choices)