【问题标题】:How to iterate specific table column in django form如何以 django 形式迭代特定的表列
【发布时间】:2016-04-13 21:05:02
【问题描述】:

我有一个选择菜单,其中显示了英语外语列表。我想根据当前查看网站的语言以西班牙语或日语显示列表。

我的模板页面上的表单默认呈现 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 中动态执行此操作?

【问题讨论】:

    标签: python django django-models django-forms


    【解决方案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=...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-25
      • 2015-12-29
      • 2014-12-29
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多