Преобразовать переменную в переменную класса (не знаю, как ее назвать) - PullRequest
0 голосов
/ 17 июля 2011

Использование

  • Flask
  • Flask-sqlalchemy
  • Sqlalchemy
  • Jquery
  • DataTables (плагин jquery)
  • Jeditable (плагин jquery)

Рассмотрим этот класс пользователя (прямо из документов flask-sqlalchemy):

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(120), unique=True)

    def __init__(self, username, email):
        self.username = username
        self.email = email

    def __repr__(self):
        return '<User %r>' % self.username

Таблицы данных делают запрос Ajaxи заполняет таблицу.Каждый тд затем становится редактируемым на месте с помощью jeditable.Как только td изменен, jeditable делает POST-запрос к localhost / modify, содержащий:

  • Идентификатор строки (тот же идентификатор из класса пользователя)
  • Новое измененное значение
  • Столбец таблицы, который был изменен (ради аргумента давайте предположим, что есть три столбца id / username / email) (int)

Теперь я быкак в функции, которая обрабатывает localhost / modify, я беру идентификатор строки, создаю объект пользователя и запрашиваю базу данных для этой конкретной строки, вижу, какое свойство необходимо изменить, изменяю его с новым значением и фиксирую в базе данных.Вот что я получил до сих пор:

@app.route('/modify', methods=['GET', 'POST'])
def modify()
    if request.method == 'POST' :
        user = user.query.get(form.row_id)
        if form.column_id == int(0):
            user.id = form.value
        elif form.column_id == int(1):
            user.username = form.value
        elif form.column_id == int(2):
            user.email = form.value
        else:
            pass
        db.session.commit()
    return 'ok'

Таким образом, да, это работает, но должен быть более красивый подход.Этот кажется не очень ... питоническим

Михаем

1 Ответ

2 голосов
/ 17 июля 2011

Использовать карту идентификатора столбца для имени атрибута.

colmap = {
    0: 'id',
    1: 'username',
    2: 'email',
}

@app.route('/modify', methods=['GET', 'POST'])
def modify()
    if request.method == 'POST' :
        user = user.query.get(form.row_id)
        try:
            setattr(user, colmap[form.column_id], form.value)
        except KeyError:
            pass
        db.session.commit()
    return 'ok'
...