【发布时间】:2012-02-29 14:19:11
【问题描述】:
我的输入格式很奇怪,但符合规范:
用户应在 4 个字段(!)中输入 ID,其中 id 是表格 460 000 005 001,其中 46 是国家代码,右侧部分是用户的 appengine ID。现在我想向这个字段添加验证,但我不能用 wtforms 来做。这是我的表单类:
class RegisterWTForm(Form):
soc_sec = TextField(_('Soc security number'), [validators.Regexp('^[0-9]+$',
message=_('This is not a social security number, please see the example and try again'
)), validators.Required(message=_('Social security number is required')), unique_soc_sec], widget=MyTextInput())
email = TextField(_('Email'),
[validators.Required(message=_('Email is required'
)),
validators.Email(message=_('Your email is invalid'
))], widget=MyTextInput())
def validate_soc_sec(form, field):
if len(field.data) != 10:
raise ValidationError(_('Soc sec must be 10 characters'
))
def validate_email(form, field):
if len(field.data) > 60:
raise ValidationError(_('Email must be less than 60 characters'
))
这是我现在使用变量的方式,它们不是 WTForm 的一部分,而是常规的 http post 参数:
def post(self):
Log1 = self.request.POST.get('Log1')
Log2 = self.request.POST.get('Log2')
Log3 = self.request.POST.get('Log3')
Log4 = self.request.POST.get('Log4')
form = RegisterWTForm(self.request.params)
if form.validate():
logging.info('validated successfully')
else:
logging.info('form did not validate')
self.render_jinja('register.html', form=form, Log1=Log1, Log2=Log2, Log3=Log3, Log4=Log4 )
return ''
email = self.request.POST.get('email')
sponsor_id = '%s%s%s' % (Log2, Log3, Log4)
if sponsor_id:
user = User.get_by_id(long(sponsor_id))
else:
return 'Sponsor with sponsor id %s does not exist' % sponsor_id
if not user:
return 'Sponsor with sponsor id %s does not exist' % sponsor_id
# make a token for a one-time login link that sets the password
# Passing password_raw=password so password will be hashed
# Returns a tuple, where first value is BOOL. If True ok, If False no new user is created
user = self.auth.store.user_model.create_user(email)
有没有办法将我的 4 个变量作为一个变量添加到我的 WTForm 并在那里添加验证,或者我应该对这些字段进行自己的自定义验证?对于我的其他字段,如果字段未通过验证,我将它们设置为红色边框和红色文本,我想在这里做同样的事情,但如果我不能,这将是表示层中的很多逻辑使用表单类执行此操作,并且必须将代码添加到模板中。你能建议做什么吗?
谢谢
更新
我可以创建一个组合字段的 FormField,但它们不能正确呈现,我不需要所有 4 个验证。也许你可以告诉我更多如何按照我想要的方式制作?
class SponsorWTForm(Form):
log1 = IntegerField('log1', [validators.required()])
log2 = IntegerField('log2', [validators.required()])
log3 = IntegerField('log3', [validators.required()])
log4 = IntegerField('log4', [validators.required()])
class RegisterWTForm(Form):
sponsor_id = FormField(SponsorWTForm)
...
【问题讨论】:
-
FormField 不接受任何验证器。但是您可以创建一个自定义验证器,通过
other = form[self.fieldname]访问其他字段。
标签: python html forms google-app-engine wtforms