我有一个选择菜单,显示英文的外语列表。我希望以西班牙语或日语显示该列表,具体取决于该网站目前正在查看的语言。
我的模板页面上的表单默认呈现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中动态执行此操作吗?
答案 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=...)