有没有办法对字典进行排序并保留其密钥?

时间:2016-07-26 09:58:00

标签: django django-forms

我创建了一个“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)

问题是表单“按原样”显示选项。我希望这些选择按字母顺序排序。

有办法做到这一点吗?

2 个答案:

答案 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类时。

https://www.djangosnippets.org/snippets/1767/

检查“懒惰选择字段”的解决方案
相关问题