WTForms中的长排序下拉列表
我想创建一个按字母顺序排列的美国州的下拉列表。我把州的元组转换成了一个有序字典,然后把这个字典放进了我的WTForms选择字段里。
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)
我的问题是,生成的下拉菜单只显示了每个州的第二个字母……
我该怎么做才能显示正确的两个字母缩写呢?还有没有更好的方法来引入不同的地理区域?
2 个回答
6
WTForms的文档提到,choices属性应该是一个包含(值,标签)对的序列。我之前错误地把它理解成了键值对,结果试图用字典来实现。其实,只需要用下面这个简单的列表推导式就可以解决这个问题……
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])
6
这里有几个问题:
你的列表其实不是列表,而是一个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)