回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>我有一个UserForm类:</p>
<pre><code>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()])
</code></pre>
<p>并希望在UpdateUserForm中使password字段成为可选字段:</p>
<pre><code>class UpdateUserForm(UserForm):
password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
</code></pre>
<p>但密码字段放在电子邮件字段之后,而不是之前。</p>
<p>子类化时如何保持字段顺序?</p>
<p>另外,当我尝试更改密码字段验证器时,它不起作用-仍然需要密码:/为什么?</p>
<pre><code>class UpdateUserForm(UserForm):
def __init__(self, **kwargs):
self.password.validators = [validators.Optional()]
super(UpdateUserForm, self).__init__(**kwargs)
</code></pre>
<p>或者</p>
<pre><code>class UpdateUserForm(UserForm):
def __init__(self, **kwargs):
self.password = TextField(u'Password', [validators.Optional()], widget=PasswordInput())
super(UpdateUserForm, self).__init__(**kwargs)
</code></pre>
<h3>一些想法…</h3>
<pre><code>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)
</code></pre>
<p>最后,我需要:</p>
<pre><code>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
</code></pre>