在Django中,如何动态选择要在ModelChoiceField中显示的自定义模型字段?

时间:2014-02-03 20:21:49

标签: django forms django-forms

我必须管理不同语言的记录,注册用户在线编辑内容,而不使用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

2 个答案:

答案 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)
相关问题