【发布时间】:2011-05-01 12:11:10
【问题描述】:
我有一个 UserForm 类:
class UserForm(Form):
first_name = TextField(u'First name', [validators.Required()])
last_name = TextField(u'Last name', [validators.Required()])
middle_name = TextField(u'Middle name', [validators.Required()])
username = TextField(u'Username', [validators.Required()])
password = TextField(u'Password', [validators.Required()], widget=PasswordInput())
email = TextField(u'Email', [validators.Optional(), validators.Email()])
并希望在 UpdateUserForm 中将密码字段设为可选:
class UpdateUserForm(UserForm):
password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
但密码字段放在电子邮件字段之后,而不是之前。
子类化时如何保持字段顺序?
此外,当我尝试更改密码字段验证器时,它不起作用 - 仍然需要密码:/ 为什么?
class UpdateUserForm(UserForm):
def __init__(self, **kwargs):
self.password.validators = [validators.Optional()]
super(UpdateUserForm, self).__init__(**kwargs)
或
class UpdateUserForm(UserForm):
def __init__(self, **kwargs):
self.password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
super(UpdateUserForm, self).__init__(**kwargs)
一些想法...
class UpdateUserForm(UserForm):
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
self._unbound_fields[4][1] = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
UserForm.__init__(self, formdata=None, obj=None, prefix='', **kwargs)
最后,我需要什么:
class UpdateUserForm(UserForm):
def __init__(self, formdata=None, obj=None, prefix='', **kwargs):
UserForm.__init__(self, formdata, obj, prefix, **kwargs)
self['password'].validators = [validators.Optional()]
self['password'].flags.required = False
【问题讨论】:
-
这个问题解决了吗?你如何渲染表格?您在哪里需要正确的订单?
-
为什么顺序很重要?你是如何在你的页面中打印出表格的?当涉及到对象属性时,我不认为 python 保证任何特定的顺序(可能是字母顺序除外?)。此外,我发现在制作用户配置文件编辑器时,最好将密码更改表单放在第二页并提供指向它的链接,因为理想情况下,您希望让用户确认他们的密码选择并且您不希望他们在没有明确选项的情况下意外更新密码。
标签: python subclassing wtforms