使用WTForms的长排序下拉列表

时间:2014-05-25 03:17:08

标签: python forms wtforms

我想按字母顺序创建美国各州的下拉列表。我已经将一个状态元组转换为OrderedDict,并将其输入到我的WTForms SelectField中。

import collections
import wtforms

STATE_ABBREV = ('AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 
                'HI', 'ID', 'IL', 'IN', 'IO', 'KS', 'KY', 'LA', 'ME', 'MD', 
                'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 
                'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 
                'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY')

def list_to_ordered_pairs(input_list):
    ordered_pairs = collections.OrderedDict()
    for item in input_list:
        ordered_pairs[item] = item
    return ordered_pairs

state_pairs = list_to_ordered_pairs(STATE_ABBREV)

class MyForm(wtforms.Form):
    state = wtforms.SelectField(label='State', choices=state_pairs)

我的问题是,生成的下拉菜单只显示每个州的第二个字母......

Dropdown

如何解决此问题以显示正确的双字母标识?拉动各个地理区域是否有更好的方法?

2 个答案:

答案 0 :(得分:3)

这里有一些问题:

您的列表不是50元组的列表。

STATE_ABBREV = ('AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 
                'HI', 'ID', 'IL', 'IN', 'IO', 'KS', 'KY', 'LA', 'ME', 'MD', 
                'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 
                'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 
                'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY')

如果你想要一个列表,它看起来像:

STATE_ABBREV = ['AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 
                'HI', 'ID', 'IL', 'IN', 'IO', 'KS', 'KY', 'LA', 'ME', 'MD', 
                'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 
                'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 
                'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY']

我不相信你的state_pairs是你认为他们的意思。他们是这样的对

>>> state_pair = 'AK'
>>> abbr, state = state_pair
>>> print abbr
A
>>> print state
K
>>>

我相信你想要的state_pair看起来像这样:

>>> state_pair = ('AK', 'Alaska')
>>> abbr, state = state_pair
>>> print abbr
AK
>>> print state
Alaska
>>>

您遇到的问题的解决方案是摆脱方法list_to_ordere_pair,只创建一个state_pairs

列表
STATE_CHOICES = [('AL', 'Alabama'),('AK','Alaska')...]

class MyForm(wtforms.Form):
    state = wtforms.SelectField(label='State', choices=STATE_CHOICES)

答案 1 :(得分:2)

WTForms docs要求choices属性为(value,label)对的序列。我错误地将其视为关键值对并试图使用字典。这个简单的列表理解可以解决这个问题......

import wtforms

STATE_ABBREV = ('AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA', 
                'HI', 'ID', 'IL', 'IN', 'IO', 'KS', 'KY', 'LA', 'ME', 'MD', 
                'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ', 
                'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC', 
                'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY')

class MyForm(wtforms.Form):
    state = wtforms.SelectField(label='State', 
        choices=[(state, state) for state in STATE_ABBREV])