Не работает поиск товаров на моем сайте Python Flask HTML
Когда вводишь название товара в строку поиска, товары показываются, но пропадает их количество в корзине, и потом не возможно вернуться на основную страницу товаров, приходится нажимать кнопку найти в строке поиска, когда строка пуста.
Вот кот из main.py:
from flask import Flask, render_template, request, url_for, redirect, jsonify
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user
from datetime import datetime, timedelta
from random import randint, choice
import re
from kodland_db import db
import bcrypt
app = Flask(__name__)
all_orders = []
poisk = ''
zakaz = 0
korzina = 0
item_id = 0
app.config.update(
SECRET_KEY = 'WOW SUCH SECRET'
)
login_manager = LoginManager()
login_manager.init_app(app)
login_manager.login_view = "login"
def hashed_password(plain_text_password):
return bcrypt.hashpw(plain_text_password.encode('utf-8'), bcrypt.gensalt())
def check_password(plain_text_password, hashed_password):
return bcrypt.checkpw(plain_text_password.encode('utf-8'), hashed_password)
class User(UserMixin):
def __init__(self, id):
self.id = id
@login_manager.user_loader
def load_user(login):
return User(login)
@app.route('/')
@login_required
def index():
global rek
rek = []
a = []
b = 0
data = db.items.get_all()
for i in range(2):
while True:
b = randint(1, len(data))
res = db.items.get('id', b)
a = [res.name, res.image, res.link]
if a in rek:
pass
else:
rek.append(a)
break
return render_template('index.html', rek=rek)
@app.route('/products/', methods=['GET', 'POST'])
@login_required
def products():
global poisk
global korzina
korzina = []
if request.method == 'POST' and 'poisk' in request.form:
data = db.items.get_all()
poisk = request.form['poisk']
return render_template('products.html', data=data, korzina=korzina, poisk=poisk)
if request.method == 'POST' and 'item_id' in request.form:
item_id = request.form['item_id']
row = db.cart.get('item_id', item_id)
if not row:
data = {'item_id':item_id, 'amount':1}
db.cart.put(data)
else:
data = {'item_id':item_id, 'amount':row.amount+1}
db.cart.delete('item_id', item_id)
db.cart.put(data)
data = db.items.get_all()
for row1 in data:
res = db.cart.get('item_id', row1.id)
if res:
row1.amount = res.amount
korzina.append(str(row1.amount))
else:
row1.amount = 0
korzina.append(str(row1.amount))
return render_template('products.html', data=data, korzina=korzina, poisk=poisk)
data = db.items.get_all()
for row1 in data:
res = db.cart.get('item_id', row1.id)
if res:
row1.amount = res.amount
korzina.append(str(row1.amount))
else:
row1.amount = 0
korzina.append(str(row1.amount))
return render_template('products.html', data=data, korzina=korzina, poisk=poisk)
def tovar_html(id, ssilka):
global korzina
global item_id
global link
korzina = 0
item_id = id
if request.method == 'POST':
row = db.cart.get('item_id', item_id)
if not row:
data = {'item_id':item_id, 'amount':1}
db.cart.put(data)
else:
data = {'item_id':item_id, 'amount':row.amount+1}
db.cart.delete('item_id', item_id)
db.cart.put(data)
res = db.cart.get('item_id', item_id)
if res:
korzina = (str(res.amount))
else:
korzina = 0
return redirect(url_for(ssilka))
res = db.cart.get('item_id', item_id)
if res:
korzina = (str(res.amount))
else:
korzina = 0
row = db.items.get('id', item_id)
link = row.link
@app.route('/cart/', methods=['GET', 'POST'])
@login_required
def cart():
if request.method == 'POST':
return redirect(url_for('order'))
data = db.cart.get_all()
total_sum = 0
for row in data:
item_row = db.items.get('id', row.item_id)
row.name = item_row.name
row.description = item_row.description
row.price = item_row.price
row.total = row.amount * item_row.price
total_sum += row.total
return render_template('cart.html', data=data, total_sum=total_sum)
@app.route('/contacts/')
@login_required
def contacts():
return render_template('contacts.html')
@app.route('/about/')
@login_required
def about():
return render_template('about.html')
@app.route('/krujka/', methods=['GET', 'POST'])
@login_required
def krujka():
item_id = 1
ssilka = 'krujka'
product = [{'name': 'Кружка',
'description': 'Это лучшая кофейная кружка, которая продается у нас! Из нее вы можете пить кофе, и наслаждаться прекрасным дизайном, идеально подобраными цветами и узорами в стиле "кофе". Сейчас со скидкой 10%!',
'price':'325 руб',
'img':'/static/images/krujka.jpg',
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/fen/', methods=['GET', 'POST'])
@login_required
def fen():
item_id = 4
ssilka = 'fen'
product = [{'name': 'Фен',
'description': 'Этот фен разработан с применением новейших технологий! Со стильным дизайном, мощным потоком воздуха, с двумя режимами работы (теплый, холодный), обладает несколькими насадками для создания стильных и обьемных причесок. Гарантия вашего индивидуального образа. Поддерживает работу с кудрявыми волосами. Сейчас со скидкой 10%!',
'price':'1445 руб',
'img':'/static/images/fen.webp'
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/tovar/', methods=['GET', 'POST'])
@login_required
def s_tovar():
item_id = 2
ssilka = 'tovar'
product = [{'name': 'Супер крутой товар',
'description': 'Это супер крутой товар, скорее покупай',
'price':'50 руб',
'img':'/static/images/tikva.jpg'
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/camera/', methods=['GET', 'POST'])
@login_required
def camera():
item_id = 3
ssilka = 'camera'
product = [{'name': 'Web камера',
'description': 'Это лучшая камера для Вашего компьютера',
'price':'345 руб',
'img':'/static/images/camera.webp'
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/printer/', methods=['GET', 'POST'])
@login_required
def printer():
item_id = 5
ssilka = 'printer'
product = [{'name': 'Принтер',
'description': 'Принтер для ПК для печати',
'price':'4896 руб',
'img':'/static/images/printer.jpg'
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/scetka/', methods=['GET', 'POST'])
@login_required
def scetka():
item_id = 6
ssilka = 'scetka'
product = [{'name': 'Зубная щетка',
'description': 'Щетка для чистки зубов',
'price':'94 руб',
'img':'/static/images/scetka.jpg'
}]
tovar_html(item_id, ssilka)
return render_template('tovar.html', product = product, korzina=korzina, id=item_id, link=link)
@app.route('/order/', methods=['GET', 'POST'])
@login_required
def order():
global zakaz
if request.method == 'POST':
for key in request.form:
if request.form[key] == '':
return render_template('order.html', error='Не все поля заполнены!')
if key == 'email':
if not re.match('\\w+@\\w+\\.(ru|com)', request.form[key]):
return render_template('order.html', error='Неправильный формат почты')
if key == 'phone_number':
if not re.match('\\+7\\d{9}', request.form[key]):
return render_template('order.html', error='Неправильный формат номера телефона')
cart_data = db.cart.get_all()
order_data = db.orders.get_all()
id_ = order_data[-1].id + 1 if order_data else 1
for row in cart_data:
item = {'id': id_, 'item_id': row.item_id, 'amount': row.amount}
db.orders.put(item)
for row in cart_data:
db.cart.delete('item_id', row.item_id)
return redirect(url_for('order_list'))
all_orders.append(request.form)
zakaz += 1
return render_template('order_list.html', zakaz = zakaz, **request.form)
return render_template('order.html')
@app.route('/api/orders/')
def api_orders():
return jsonify(all_orders)
@app.route('/order_list/')
@login_required
def order_list():
return render_template('order_list.html')
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
row = db.users.get('login', request.form['login'])
if not row:
return render_template('login.html', error='Неправильный логин или пароль')
if check_password(request.form['password'], row.password):
user = User(login) # Создаем пользователя
login_user(user) # Логинем пользователя
return redirect(url_for('index'))
else:
return render_template('login.html', error='Неправильный логин или пароль')
return render_template('login.html')
@app.route('/register/', methods=['GET', 'POST'])
def register():
# Генератор пароля
simvol = randint(10, 20)
password_gen = ''
for i in range(simvol):
b = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd', 'E', 'e', 'F', 'f' , 'G', 'g' ,
'H' ,'h' ,'I' ,'i' ,'J' ,'j' ,'K' ,'k' , 'L', 'l', 'M', 'm', 'N', 'n',
'O', 'o', 'P', 'p', 'Q', 'q', 'R', 'r', 'S', 's', 'T', 't', 'U', 'u',
'V', 'v', 'W', 'w', 'X', 'x', 'Y', 'y', 'Z', 'z', '!', '?']
c = randint(0, 9)
dd = randint(0, 53)
randoma = randint(1, 2)
if randoma == 1:
password_gen += b[dd]
else:
password_gen += str(c)
if request.method == 'POST':
for key in request.form:
if request.form[key] == '':
return render_template('register.html', message='Все поля должны быть заполнены!', password_gen = password_gen)
if request.form['password'] != request.form['password_check']:
return render_template('register.html', message='Пароли не совпадают', password_gen = password_gen)
row = db.users.get('login', request.form['login'])
if row:
return render_template('register.html', message='Такой пользователь уже существует!', password_gen = password_gen)
row = db.users.get('phone_number', request.form['phone_number'])
if row:
return render_template('register.html', message='Такой номер телефона уже был использован!', password_gen = password_gen)
row = db.users.get('email', request.form['email'])
if row:
return render_template('register.html', message='Такая почта уже была использована!', password_gen = password_gen)
data = dict(request.form)
data.pop('password_check')
data['password'] = hashed_password(str(request.form['password']))
db.users.put(data=data)
return render_template('register.html', message='Регистрация прошла успешно', password_gen = password_gen)
return render_template('register.html', password_gen = password_gen)
@app.route("/logout/")
@login_required
def logout():
logout_user()
return redirect(url_for('login'))
if __name__ == "__main__":
app.run()
Вот код из products.html:
{% extends 'index.html' %}
{% block head %}
<link rel="stylesheet" href= "../static/css/products.css">
<title>Товары</title>
{% endblock %}
{% block content %}
<form action="/products" method='POST'>
<input type="text" placeholder="Введите название товара" name='poisk'>
<button type="submit">Найти!</button>
</form>
<table>
<tr>
<th>Наименование</th>
<th>Описание</th>
<th>Цена</th>
<th>Фото</th>
<th></th>
</tr>
{% if poisk == '' %}
{% for row in data %}
<form action="/products" method='POST'>
<tr>
<input type="hidden" value="{{row.id}}" name='item_id'>
<td><a href="{{row.link}}">{{row.name}}</a></td>
<td>{{row.description}}</td>
<td>{{row.price}} руб</td>
<td><img src="../static/images/{{row.image}}" width="90" height="90" /></td>
<td><button type="submit">В корзину</button><br>В корзине: {{korzina[row.id - 1]}}</td>
</tr>
</form>
{% endfor %}
{% endif %}
{% if poisk != '' %}
{% for row in data %}
{% if poisk in row.name %}
<form action="/products" method='POST'>
<tr>
<input type="hidden" value="{{row.id}}" name='item_id'>
<td><a href="/product1">{{row.name}}</a></td>
<td>{{row.description}}</td>
<td>{{row.price}} руб</td>
<td><img src="../static/images/{{row.image}}" width="90" height="90" /></td>
<td><button type="submit">В корзину</button><br>В корзине: {{korzina[row.id - 1]}}</td>
</tr>
</form>
{% endif %}
{% endfor %}
{% endif %}
</table>
<div class='footer_mnogo_contenta'>
<span style="font-size: 15pt;">Тех.поддержка: <br>
Почта: [email protected] <br>
Telegram: +79529404135 <br>
Номер телефона: +79537752212<span>
</div>
{% endblock %}
На предыдущем вопросе проблема решилась, но тут уже по сложнее.
Вот база данных товаров:
Вот база данных корзины:
Так же, есть проблемы с order.html. На этой странице оформляется заказ. После этого, заказ должен добавляться в список all_orders и показываться на странице api/orders. Но после оформления заказа, список остается пуст.
Код из order.html:
{% extends 'index.html' %}
{% block head %}
<link rel="stylesheet" href="/static/css/order.css">
{% endblock %}
{% block content %}
<form action='/order/' method='post'>
{{error}}
{{error1}}
<ul class="form">
<li>
<input type="text" name="name" placeholder="Имя">
</li>
<li>
<input type="text" name="fname" placeholder="Фамилия">
</li>
<li>
<input type="text" name="adress" placeholder="Адрес">
</li>
<li>
<input type="text" name="phone_number" placeholder="Номер Телефона">
</li>
<li>
<input type="text" name="email" placeholder="email">
</li>
<li>
<input type="datetime-local" name="date" placeholder="Дата доставки">
</li>
<li>
<select name="delivery_type">
<option value="Доставка на дом">Доставка на дом</option>
<option value="Пункт самовывоза">Пункт самовывоза</option>
</select>
</li>
<li>
<input type="text" name="send" placeholder="Сообщение продавцу">
</li>
<li>
<button type="submit">Оформить заказ!</button>
</li>
</ul>
</form>
<div class='footer_standart'>
<span style="font-size: 15pt;">Тех.поддержка:<br>
Почта: [email protected]<br>
Telegram: +79529404135<br>
Номер телефона: +79537752212<span>
</div>
{% endblock %}
А еще, на странице order_list, куда нас должно переводить после оформления заказа, не отображается информация о заказе, которая должна там быть.
Код из order_list.html:
{% extends 'index.html' %}
{% block head %}
<link rel="stylesheet" href="../static/css/order_list.css">
<link rel="stylesheet" href="/static/css/order.css">
{% endblock %}
{% block content %}
<p>
Заказ № {{zakaz}} был оформлен на имя {{name}} {{fname}} по адресу {{adress}}
</p>
<p>
Доставка запланирована на {{date}}
</p>
<p>
Данные для связи:
</p>
<p>
Телефон: {{phone_number}}
</p>
<p>
Электронная почта: {{email}}
</p>
<p>
Тип доставки: {{ delivery_type }}
</p>
<p>
Сообщение продавцу: {{ send }}
</p>
<div class='footer_standart'>
<span style="font-size: 15pt;">Тех.поддержка:<br>
Почта: [email protected]<br>
Telegram: +79529404135<br>
Номер телефона: +79537752212<span>
</div>
{% endblock %}
Помогите пожалуйста!!!

