Как создать представление с пустой таблицей, в которую пользователь может добавлять новые строки на основе записей в базе данных [flask и bootstrap3] - PullRequest
0 голосов
/ 15 октября 2019

В моей базе данных 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)
...