Нужно ли использовать WTForms для кнопок при добавлении товаров в корзину? - PullRequest
0 голосов
/ 14 ноября 2018

Итак, я делаю «приложение по аренде», где у меня есть 3 класса в моем приложении Flask.

Ниже приведены классы, которые я реализовал:

User (как самый верхний уровенькласс)

Cart (у каждого пользователя есть корзина)

Rental (у пользователя / корзины может быть «от 0 до много» прокатов)

cart_with_items = db.Table('cart_with_items',
    db.Column('cart_id', db.Integer, db.ForeignKey('cart.id'), primary_key=True),
    db.Column('rental_id', db.Integer, db.ForeignKey('rental.id'), primary_key=True)
    )


class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(15), unique=True)
    email = db.Column(db.String(50), unique=True)
    password = db.Column(db.String(80))

    cart = db.relationship("Cart", backref='user', lazy=True, uselist=False)


class Cart(db.Model):
    id = db.Column(db.Integer, primary_key=True)

    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)

    rentals = db.relationship('Rental', secondary=cart_with_items, lazy='subquery', backref=backref('carts', lazy=True))

@app.route("/dashboard/checkout", methods=['POST'])
def add_item(self,item):
    try:
        this.rentals.append(Rental(1,"2",3.5,"url"))
        return '<h1> it worked</h1>'
    except:
        return '<h1>Didnt work</h1>'



class Rental(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    item_name = db.Column(db.String(15), unique=True);
    item_cost = db.Column(db.Float)
    item_image_url = db.Column(db.String(100))
    #foreign key is a primary key that refers to a key in another table


    def __init__(self,item_id,item_name, item_cost, item_image_url):
        self.id = item_id
        self.item_name = item_name
        self.item_cost = item_cost
        self.item_image_url = item_image_url

    def get_item_id():
        return self.id

    def getItemname():
        return self.item_name

    def getCost():
        return self.item_cost

Затем я рендерим_темплату на странице 'панели инструментов' и передаю пользовательский объект, к которому затем будет создана корзина с композицией.

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

Кнопка - это то, с чем у меня проблемы.Я пытался реализовать функцию в классе Cart, чтобы добавить элемент в аренду, но это оказывается трудным ...

Я не знаю, смогу ли я сделать onClick() в шаблонах jinja2но мне интересно, стоит ли мне просто использовать WTForms и пытаться публиковать нужные элементы обратно в функцию, отрисовывающую данный шаблон?

Прежде всего, мой вопрос состоит в том, является ли WTForms наиболее приемлемым, и должны ли WTForms бытьрешение моей проблемы?Я слишком запутался в своей реализации?

1 Ответ

0 голосов
/ 15 ноября 2018

Чтобы ответить на ваш основной вопрос, следует ли вам использовать WTForms, зависит от того, нужно ли вам собирать какие-либо пользовательские данные, помимо простого нажатия на кнопку.WTForms действительно хороши при извлечении данных формы из тела запроса, затем приводят данные к нужным типам и запускают для них валидаторы.Если у вас нет полей формы, это, вероятно, мало чем поможет.

На ваш вопрос о Javascript в шаблонах Jinja2 - да, вы можете указать <script> s в шаблоне.Вы можете поместить любой текст в шаблон, и он будет отображен точно как есть (если, конечно, это не оператор Jinja).Таким образом, вы можете встроить свой JS непосредственно в шаблон или поместить его в файл .js и связать его тегом <script src=>.

И, наконец, если вы ничего не пропустили, ваш обработчик маршрута /dashboard/checkout завершится сбоем во время выполнения с сообщением о том, что он ожидает 2 аргумента, но ни один из них не предоставлен.Причина в том, что 1: у свободных функций (не входящих в класс) нет параметра self, и 2, в вашем маршруте нет переменной.Чтобы получить то, что, я думаю, вам нужно, вам нужно сделать следующее:

@app.route("/dashboard/checkout/<item>", methods=['POST'])
def add_item(item):

Затем обработчик маршрута передаст все, что находится в <item>, в качестве параметра item в add_item.

Предполагая, что вы перебираете арендные платы как аренду, очень удобный способ создать этот URL в шаблоне: {{url_for (add_item, item = rental.id)}}}

Вызатем вы можете использовать этот URL либо для вызова JavaScript AJAX (если вы не хотите покидать страницу), либо вы можете использовать его как action в форме с кнопкой отправки:

<form method="POST" action="{{ url_for(add_item, item=rental.id) }}">
<input type="Submit" value="Rent This!">
</form>

Это позволит вам сделать POST для вашей конечной точки (которая также будет перемещаться со страницы).Но поскольку эта форма не имеет полей и данных, вам действительно не нужны WTForms для ее обработки.

...