我创建了一个“Enums
”类:
class PersonneEnums(object):
LANGUE_ALBANAIS = 0
LANGUE_ALLEMAND = 1
LANGUE_ANGLAIS = 2
LANGUE_ARABE = 3
LANGUE_ARMENIEN = 4
LANGUE_BENGALI = 5
LANGUE_CATALAN = 6
LANGUE_CHINOIS = 7
LANGUE_COREEN = 8
LANGUE_CROATE = 9
LANGUE_DANOIS = 10
LANGUE_ESPAGNOL = 11
LANGUE_FINNOIS = 12
LANGUE_FRANCAIS = 13
LANGUE_GREC = 14
LANGUE_HONGROIS = 15
LANGUE_ITALIEN = 16
LANGUE_MALAIS = 17
LANGUE_MONGOL = 18
LANGUE_NEERLANDAIS = 19
LANGUE_OCCITAN = 20
LANGUE_PERSAN = 21
LANGUE_PORTUGAIS = 22
LANGUE_ROUMAIN = 23
LANGUE_RUSSE = 24
LANGUE_SERBE = 25
LANGUE_SLOVAQUE = 26
LANGUE_SLOVENE = 27
LANGUE_SUEDOIS = 28
LANGUE_TURC = 29
LANGUE_AUTRE = 30
TAB_LANGUE = {
LANGUE_ALBANAIS: _(u'Albanian'),
LANGUE_ALLEMAND: _(u'German'),
LANGUE_ANGLAIS: _(u'English'),
LANGUE_ARABE: _(u'Arabic'),
LANGUE_ARMENIEN: _(u'Armenian'),
LANGUE_BENGALI: _(u'Bengali'),
LANGUE_CATALAN: _(u'Catalan'),
LANGUE_CHINOIS: _(u'Chinese'),
LANGUE_COREEN: _(u'Korean'),
LANGUE_CROATE: _(u'Croatian'),
LANGUE_DANOIS: _(u'Danish'),
LANGUE_ESPAGNOL: _(u'Spanish'),
LANGUE_FINNOIS: _(u'Finnish'),
LANGUE_FRANCAIS: _(u'French'),
LANGUE_GREC: _(u'Greek'),
LANGUE_HONGROIS: _(u'Hungarian'),
LANGUE_ITALIEN: _(u'Italian'),
LANGUE_MALAIS: _(u'Malaysian'),
LANGUE_MONGOL: _(u'Mongolian'),
LANGUE_NEERLANDAIS: _(u'Dutch'),
LANGUE_OCCITAN: _(u'Occitan'),
LANGUE_PERSAN: _(u'Persian'),
LANGUE_PORTUGAIS: _(u'Portuguese'),
LANGUE_ROUMAIN: _(u'Romanian'),
LANGUE_RUSSE: _(u'Russian'),
LANGUE_SERBE: _(u'Serbian'),
LANGUE_SLOVAQUE: _(u'Slovakian'),
LANGUE_SLOVENE: _(u'Slovenian'),
LANGUE_SUEDOIS: _(u'Swedish'),
LANGUE_TURC: _(u'Turkish'),
LANGUE_AUTRE: _(u'Other'),
}
当我将其添加到表单中时,它就像这样:
class ProfileForm(forms.ModelForm):
class Meta:
model = Personne
fields = ('blablafields',)
e = {'required': _(u'This field is required'),
'invalid': _(u'This field contains invalid data')}
a = _(u'Mother tongue:')
langue = forms.IntegerField(
label=a, required=True,
widget=forms.Select(attrs={
'title': a,
'groupno': 2,
'class': 'form-control', },
choices=[('', '--')] + [(k, PersonneEnums.TAB_LANGUE[k])
for k in PersonneEnums.TAB_LANGUE]),
error_messages=e)
问题是表单“按原样”显示选项。我希望这些选择按字母顺序排序。
有办法做到这一点吗?
答案 0 :(得分:1)
您应该使用OrderedDict
from collections import OrderedDict
class PersonneEnums(object):
LANGUE_ALBANAIS = 0
LANGUE_ALLEMAND = 1
...
TAB_LANGUE = OrderedDict((
(LANGUE_ALBANAIS, _(u'Albanian')),
(LANGUE_ALLEMAND, _(u'German')),
...
))
这样您的所有商品都会按照TAB_LANGUE
。
然后你应该使用.items()
class ProfileForm(forms.ModelForm):
class Meta:
model = Personne
fields = ('blablafields',)
e = {'required': _(u'This field is required'),
'invalid': _(u'This field contains invalid data')}
a = _(u'Mother tongue:')
langue = forms.IntegerField(
label=a, required=True,
widget=forms.Select(attrs={
'title': a,
'groupno': 2,
'class': 'form-control', },
choices=(('', '--'),) + tuple(PersonneEnums.TAB_LANGUE.items()),
error_messages=e)
<强>更新强> 另外还有非常酷的第三方django应用程序dj.choices。这对于这类任务非常有帮助。
答案 1 :(得分:0)
这个解决方案怎么样:
langues_classees = sorted(PersonneEnums.TAB_LANGUE.items(), key=lambda t: t[1])
.items()
与[(k, dictionnaire[k]) for k in dictionnaire]
此外,如果您需要在某些时候将其与任何其他语言管理工具联系起来,您应该使用ISO语言代码(例如ar代表阿拉伯语,hy代表亚美尼亚语,en代表英语代码,zh代表中文代码等)想出你自己的代码
<强>更新强>: 上面的解决方案可能不适合您的用例,因为您可能希望在请求时进行排序,并且取决于浏览器的语言(“德语”在英语后面是“阿拉伯语”,但是在法语中,'Allemand'在'Arabe'之前,而不是在声明Form类时。
检查“懒惰选择字段”的解决方案