在 python 中保证保持类中属性的顺序?这是怎么保证的?手册中哪里有规定?
这将字段声明性地定义为类属性:
class MyForm(Form):
first_name = TextField(u'First Name', validators=[validators.required()])
last_name = TextField(u'Last Name', validators=[validators.optional()])
...
def get(self):
form = MyForm(self.request.arguments)
form=form
self.render('forms.html', form=form)
即使我有 n 个项目,名字也总是第一个,姓氏第二个?
请您参考如下方法:
不,属性的顺序通常不能保证,因为 Python 将属性存储在字典中。
相反,wtforms 使用特殊技巧来检测定义了哪些订单字段,从而解决了这个问题。每次创建 Field 对象时,计数器都会递增,并且会为字段实例分配一个唯一编号。这使得对象可排序:
class UnboundField(object):
_formfield = True
creation_counter = 0
def __init__(self, field_class, *args, **kwargs):
UnboundField.creation_counter += 1
# [...]
self.creation_counter = UnboundField.creation_counter
因此 Field 实例有一个 creation_counter 值,每次将新字段添加到表单时该值都会递增。
FormMeta 类然后在字段上使用该值以正确的顺序对它们进行排序:
fields.sort(key=lambda x: (x[1].creation_counter, x[0]))
