如何以django形式迭代特定的表列

时间:2016-04-13 21:05:03

标签: python django django-models django-forms

我有一个选择菜单,显示英文的外语列表。我希望以西班牙语或日语显示该列表,具体取决于该网站目前正在查看的语言。

我的模板页面上的表单默认呈现en(英语)。这就是我的模板页面中的样子:

{{ form.native }}

我的表单从“this_language”参数中了解网站正在查看的当前语言。我的表格如下:

class RegistrationForm(forms.ModelForm):

    def __init__(self,*args,**kwargs):

        if 'this_language' in kwargs:
            this_language = kwargs.pop('this_language')
            super(RegistrationForm, self).__init__(*args, **kwargs)
            self.fields['native'] = forms.ModelChoiceField(queryset=Language.objects.all().order_by(this_language), empty_label=_('Please select'))

该模型如下所示:

class Language(models.Model):
    en = models.CharField(max_length=250)
    es = models.CharField(max_length=250, null=True)
    ja = models.CharField(max_length=250, null=True)

    def __unicode__(self):
        return self.en

我注意到我可以将模型中的“return self.en”更改为es或js,然后我得到所需的结果。

但是可以在模板页面或forms.py中动态执行此操作吗?

1 个答案:

答案 0 :(得分:1)

我没有机会尝试,但如果您希望为ModelChoiceField显示除__unicode__之外的其他显示,则可以定义自己的表单字段。它继承自ModelChoiceField,但覆盖label_from_instance方法:

class LanguageChoiceField(forms.ModelChoiceField):
    def __init__(self, *args, **kwargs):
        self.language = kwargs.pop('language', None)
        super(LanguageChoiceField, self).__init__(*args, **kwargs)

    def label_from_instance(self, obj):
         # return the field you want to display
         if self.language:
             return getattr(obj, self.language)
         return obj.en

class RegistrationForm(forms.ModelForm):
    # your code
    self.fields['native'] = LanguageChoiceField(language=this_language, queryset=...)