将参数传递给 class 成为函数的关键字
Pass an argument to a class which becomes a keyword for a function
将 WTForms 与 Flask 和 SQLAlchemy 结合使用。从用户名和电子邮件字段中获取数据并确保它不在数据库中。这是我现在必须做的事情。
class IsUnique(object):
def __init__(self, db_field=None):
self.db_field = db_field
def __call__(self, form, field):
data = field.data
if self.db_field=='name':
if User.query.filter_by(name=data).first() != None:
raise ValidationError('Sorry, that username is taken.')
if self.db_field=='email':
if User.query.filter_by(email=data).first() != None:
raise ValidationError(
'Sorry, that email address has already been registered.'
)
我想做的是将 db_field 参数作为字符串传递给 class 实例,然后将其传递给 User.query.filter_by(db_field=data
。不幸的是,我所知道的就是使用 if 语句,它可以工作,但有点麻烦。一定有办法做到这一点,但我不知道怎么做。
你可以传递 keyword arguments as a dict,像这样:
def __call__(self, form, field):
key = self.db_field # 'name' or 'email'
params = { key: field.data }
if User.query.filter_by(**params).first() != None:
raise ValidationError('Sorry, that {} is taken.'.format(key))
将 WTForms 与 Flask 和 SQLAlchemy 结合使用。从用户名和电子邮件字段中获取数据并确保它不在数据库中。这是我现在必须做的事情。
class IsUnique(object):
def __init__(self, db_field=None):
self.db_field = db_field
def __call__(self, form, field):
data = field.data
if self.db_field=='name':
if User.query.filter_by(name=data).first() != None:
raise ValidationError('Sorry, that username is taken.')
if self.db_field=='email':
if User.query.filter_by(email=data).first() != None:
raise ValidationError(
'Sorry, that email address has already been registered.'
)
我想做的是将 db_field 参数作为字符串传递给 class 实例,然后将其传递给 User.query.filter_by(db_field=data
。不幸的是,我所知道的就是使用 if 语句,它可以工作,但有点麻烦。一定有办法做到这一点,但我不知道怎么做。
你可以传递 keyword arguments as a dict,像这样:
def __call__(self, form, field):
key = self.db_field # 'name' or 'email'
params = { key: field.data }
if User.query.filter_by(**params).first() != None:
raise ValidationError('Sorry, that {} is taken.'.format(key))