В моей базе данных SQLite3 у меня есть таблица, которая содержит три столбца, Product Name
, Description
и Like
. В настоящее время у меня есть сайт администратора, где я могу удалять и добавлять новые продукты, используя flask-admin
. Но теперь я хочу создать интерактивную таблицу с использованием flask и bootstrap3, где пользователю впервые представляется пустая таблица. Пользователь должен иметь возможность добавлять новые строки, ища название продукта из Product Name
в моей базе данных. Тогда пользователь должен иметь возможность изменить столбец Like
на 0 или 1.
Я не уверен, как реализовать это представление с пустой таблицей, а также добавить кнопку, которая добавляет новые записи в таблицуоснованный на названиях продуктов в моей БД и на том, как сделать сообщение POST в БД для обновления, если пользователю нравится или не нравится продукт.
В настоящее время мой app.py
выглядит следующим образом
from flask import Flask
from flask_admin import Admin
from models import db, Products
app = Flask(__name__)
# Create dummy secrey key so we can use sessions
app.config['SECRET_KEY'] = '123456790'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# Create in-memory database
app.config['DATABASE_FILE'] = 'mna.db'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + app.config['DATABASE_FILE']
db.init_app(app)
# Flask views
@app.route('/')
return "Here is where I want the user to be presented with an empty table"
#I have added an admin site where I can update
from views import ProductView
admin = Admin(app, template_mode="bootstrap3")
admin.add_view(ProductView(Products, db.session))
if __name__ == '__main__':
app.run(debug = True)
Мой класс Products
выглядит следующим образом.
class Products(db.Model):
productname = db.Column(db.String(), primary_key=True)
description = db.Column(db.String(), nullable=False)
like = db.Column(db.Boolean(), nullable=False)
def __str__(self):
return unicode(self).encode('utf-8')
def __unicode__(self):
return "Name: {productname}; Description : {description}".format(productname=self.productname, description=self.description)
Мой класс ProductsView
выглядит следующим образом
from flask import redirect, flash, url_for
from flask_admin import expose
from flask_admin.contrib import sqla
from flask_admin.helpers import get_form_data
from flask_admin.babel import gettext
from markupsafe import Markup
class ProductView(sqla.ModelView):
page_size = 100
column_list = ('productname', 'description', 'like')
column_editable_list = ['like']
# override the column labels
column_labels = {
'productname': 'Product Name',
'description': 'Description',
}
def _format_like_now(view, context, model, name):
if model.like:
return 'Liked'
# render a form with a submit button for product, include a hidden field for the product name
# note how checkout_view method is exposed as a route below
checkout_url = url_for('.checkout_view')
_html = '''
<form action="{checkout_url}" method="POST">
<input id="Product Name" name="Product Name" type="hidden" value="{name}">
<button type='submit'>Checkout</button>
</form
'''.format(checkout_url=checkout_url, name=model.name)
return Markup(_html)
column_formatters = {
'Like': _format_like_now
}
@expose('checkout', methods=['POST'])
def checkout_view(self):
return_url = self.get_url('.index_view')
form = get_form_data()
if not form:
flash(gettext('Could not get form from request.'), 'error')
return redirect(return_url)
# Form is an ImmutableMultiDict
product_name= form['name']
# Get the model from the database
model = self.get_one(product_name)
if model is None:
flash(gettext('Product not not found.'), 'error')
return redirect(return_url)
# process the model
model.like = True
try:
self.session.commit()
flash(gettext('Product Name: {name}, set as liked'.format(name=product_name)))
except Exception as ex:
if not self.handle_view_exception(ex):
raise
flash(gettext('Failed to set Product Name: {name}, as liked'.format(name=product_name), error=str(ex)), 'error')
return redirect(return_url)