2016-08-07 4 views
0

Использование WTForms с флягой и 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 аргумент к экземпляру класса в виде строки и передать его в User.query.filter_by(db_field=data. К сожалению, все, что я знаю, как это сделать, это использовать оператор if, который работает, но является довольно громоздким. Должен быть способ сделать это правильно, но я не знаю, как это сделать.

ответ

2

Вы можете передать 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))