Answer the question
In order to leave comments, you need to log in
Flask-sqlalchemy how to check\create\update rows in database?
Good time of the day!
I ran into this situation: a test project on Flask, it was necessary to save the settings of individual "modules" in the database, before that they were stored in .txt
and so there is a Setting table and its model in the database
class Setting(db.Model):
id = db.Column(db.Integer, primary_key = True)
group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
value = db.Column(db.Text)
#......
if request.method == 'POST':
data = db.session.query(Setting).filter_by(group='setting').first()
if not data:
db.session.add_all([Setting(group='setting', key='domain', value=request.form['domain']),
Setting(group='setting', key='name', value=request.form['name']),
Setting(group='setting', key='title', value=request.form['title']),
Setting(group='setting', key='mdescription', value=request.form['mdescription']),
Setting(group='setting', key='mkeywords', value=request.form['mkeywords']),
db.session.commit()
# .....--- здесь наверно должен быть некий код для обновление строк в базе, ток как написать незнаю чтоб обновить сразу 4 строки в базе :(
db.session.commit()
test = db.session.query(Setting).filter_by(group='setting').all()
return render_template('setting.html', test=test)
data = db.session.query(Setting).filter_by(group='setting').first()
if not data:
Answer the question
In order to leave comments, you need to log in
Here, after the selection and analysis of parameters and situations, the result is this:
(I would be grateful if someone adds edits on optimization in the comments)
we have a form with fields for the type:
<input name=domain type="text" value="{{ data.domain }}">
<input name=name type="text" value="{{data.name}}">
.......... и так далее..... вьюшка получилась универсальна -
можно хоть сотни input добавлять прямо в шаблоне,
главное чтоб имена были у всех разные
app.route('/setting/', methods=['GET', 'POST', 'DELETE'])
def setting():
if not session.get('logged_in'): # проверяем залогин ли usr
abort(404)
if request.method == 'DELETE': # Если метод HTTP = DELETE удаляем настройки для группы setting
db.session.query(Setting).filter_by(group='setting').delete()
db.session.commit()
return render_template('setting.html')
data = {} #создаем словарь - в нем собираем данные и отправляем обратно в форму (так как разложить data = db.session.query(Setting).all() в шаблоне без переборов у меня не хватило ума... :( , а так по-моему проще )
if request.method == 'POST':
for i in request.form.keys(): # обрабатываем каждый input по отдельности
u = db.session.query(Setting).filter_by(group='setting').filter_by(key=i).first()
if u: # если существует обновляем значением из form
u.value = request.form[i]
data[i] = request.form[i] # добавляем в словарь
else:
db.session.add(Setting(group='setting', key=i, value=request.form[i])) # в противном случае создаем новое поле в базе данных и добавляем обратно в словарь
data[i] = request.form[i]
db.session.commit() # Записать изменения в Базу данных
return render_template('root/setting.html', data=data) # как видите словарь ушел обратно к темплею, в указном выше примере показано как словарь раскладывается....
u = db.session.query(Setting).filter_by(group='setting').all() # Ну а пи простом GET запросе выгружаем все записи по группе, создаем словарь и отправляем на рендринг
for i in u:
data[i.key]=i.value
return render_template('root/setting.html', data=data)
class Setting(db.Model):
id = db.Column(db.Integer,primary_key = True)
group = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
key = db.Column(db.String(32), nullable=False, default = 'NONE', index = True)
value = db.Column(db.Text, index = True)
def get_id(self):
return self.id
def __unicode__(self):
return self.id
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question