Добавление товаров в корзину Python Flask - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать функциональность AddtoCart и Checkout, используя python flask и flask-sqlalchemy. Я считаю себя новичком в веб-разработке в целом. Как мне взять товар и добавить его в корзину как товар, используя кнопку? Я также хотел бы рассчитать общую стоимость товаров в корзине.

До сих пор я создал две модели (ProductItem, CartItem). Я успешно создал 2 ProductItems (фиктивные данные) и смог отобразить их в виде, используя цикл for с шаблоном jinja2. Я пытался создать функцию, чтобы выбрать продукт и добавить его в корзину, но я не мог понять, как заставить функционировать кнопку добавления в корзину.

Заранее спасибо !!

class ProductItem(db.Model):
     __tablename__='products'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(64),unique=True)
    descr = db.Column(db.Text,unique=True,nullable=True)
    price = db.Column(db.Float,nullable=False)
    img = db.Column(db.String(64),unique=True)
    cartitems = db.relationship('CartItem', backref='Product')
    def __repr__(self):
        return '<ProductName %r>' % self.name

class CartItem(db.Model):
    __tablename__='cartitems'
    id = db.Column(db.Integer,primary_key=True)
    # adding the foreign key
    product_id = db.Column(db.Integer, db.ForeignKey('products.id'))

@app.route('/')
def index():
    products = Product.query.all()
    return render_template('home.html',products=products)
def getproductitem():
    itemid = product.id
    productname = product.name
    productname = CartItem(product_id=itemid)
    db.session.add(product)
    db.session.commit()

----------------html jinja----------
{% for product in products %}
    <div class="product-item">
        <h3>{{ product.name }}</h3> 
        <img src="static/img/products/{{ product.img }}" alt="" width="200px" height="200px">
        <p> {{ product.price }}</p>
        <button onclick="getproductitem()" type="button" class="btn btn-primary">Add to Cart</button>
     </div>           
{% endfor %}

1 Ответ

0 голосов
/ 11 октября 2019

Редактировать

Понял, я не ответил на вопрос о кнопке. Похоже, вы пытаетесь вызвать функцию python из html (если у вас нет функции javascript в шаблоне внешнего интерфейса).

Ваш питон живет на сервере, а ваш html / javascript будет в браузере клиента - вам нужно заставить их общаться, отправив HTTP-запрос со своей страницы на сервер, вы не можете напрямую вызывать функции.

Сервер:

@app.route('/cart/<int:product_id>', methods=['POST'])
def add_to_cart(product_id):

    product = Product.query.filter(Product.id == product_id)
    cart_item = CartItem(product=product)
    db.session.add(cart_item)
    db.session.commit()

    return render_tempate('home.html', product=products)

добавить в html:

<script>
function addToCart(productId) {
    fetch('[your.local.host.]/cart/productId', 
        {method: 'POST'}
    )
}
</script>

изменить кнопку:

<button onclick="addToCart({{product.id}})" type="button" class="btn btn-primary">Add to Cart</button>

Или что-то подобное. Ваша страница должна общаться с вашим сервером через HTTP-запросы.

Оригинальный ответ об тележках

Вероятно, нет необходимости сохранять вашу корзину в базе данных, если вы действительно не хотитепользователи могут получить доступ к одной и той же корзине при входе в систему на разных устройствах, или вы ожидаете, что им потребуется более долгое время хранить там товары.

Сохранение добавит ненужное время к пользовательским запросам (пока вы добавляете / извлекаете их). ) и эта таблица CartItem будет продолжать увеличиваться и увеличиваться, а большинство строк станут избыточными (маловероятно, что люди захотят просматривать свою старую корзину после покупки продуктов). Одним из решений было бы также связать корзины с таблицей User, чтобы у вас была только одна корзина на пользователя (при условии, что ваши пользователи вошли в систему при совершении покупок), или убедитесь, что вы удаляете корзины, когда они куплены или по истечении определенного временипериод.

Тем не менее, если вам больше не нужно сохраняться в течение более длительного срока, рассмотрите возможность хранения идентификаторов продукта либо в

  1. Колба session. По сути, это легковесное хранилище в памяти на сервере, которое связано с пользователем и может быть доступно во время обработки запроса. См. Учебник по сеансам здесь .

  2. Внутри cookie. Cookie хранится в браузере (не на сервере) и обычно подписывается ключом. Это не делает их безопасными - это просто означает, что вы можете быть уверены, что никто не изменил его содержимое при извлечении его на сервер. См. Учебное пособие здесь .

В этой статье обсуждаются некоторые недостатки / достоинства обоих подходов.

...