Flask wtforms AttributeError: 'HTMLString' object has no attribute 'paginate'
Flask wtforms AttributeError: 'HTMLString' object has no attribute 'paginate'
有人在这里用一些很棒的代码帮助我多次显示相同的表单,每次都有一个提交按钮,这很有效,但是由于我将有数百个表单,我需要对页面进行分页,所以我一直过去能够对页面进行分页,但我不知道如何在 for 循环中使用该代码和表单。
这是我的代码:(在 Greg 的帮助下)
@bp.route('/stock', methods=['GET', 'POST'])
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
stocks = Stock.query.all()
forms = []
for stock in stocks:
form = AddStockForm()
form.id.default = stock.id
form.image.default = stock.image_url
form.date.default = stock.date
form.description.default = stock.description
form.event.default = stock.event
form.achat.default = stock.achat
form.vente.default = stock.vente
form.sold.default = stock.sold
forms.append(form)
for form in forms:
if form.validate_on_submit():
if form.modify.data:
stock = Stock.query.filter_by(id=form.id.data).one()
stock.date = form.date.data
stock.description = form.description.data
stock.event = form.event.data
stock.achat = form.achat.data
stock.vente = form.vente.data
stock.sold = form.sold.data
db.session.add(stock)
db.session.commit()
elif form.delete.data:
stock = Stock.query.filter_by(id=form.id.data).one()
db.session.delete(stock)
db.session.commit()
return redirect(url_for('stock.stock'))
form.process() # Do this after validate_on_submit or breaks CSRF token
page = request.args.get('page', 1, type=int)
forms = forms[1].id().paginate(
page, current_app.config['ITEMS_PER_PAGE'], False)
next_url = url_for('stock.stock', page=forms.next_num) \
if forms.has_next else None
prev_url = url_for('stock.stock', page=forms.prev_num) \
if forms.has_prev else None
return render_template('stock/stock.html',forms=forms.items, title=Stock, stocks=stocks)
我正在尝试使用事实 "forms" 是一个列表来对结果进行分页,我显然不明白该怎么做,我看过 flask-paginate 但我也不明白!
非常需要所有帮助
热烈的问候,保罗。
编辑
我尝试使用 flask_pagination,这是我的代码:
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
search = False
q = request.args.get('q')
if q:
search = True
page = request.args.get(get_page_parameter(), type=int, default=1)
stocks = Stock.query.all()
forms = []
#rest of code here#
pagination = Pagination(page=page, total=stocks.count(), search=search, record_name='forms')
form.process() # Do this after validate_on_submit or breaks CSRF token
return render_template('stock/stock.html',forms=forms, title=Stock, pagination=pagination)
这给出了不同的错误 "TypeError: count() takes exactly one argument (0 given)" 我也尝试过 "total=forms.count()" 并得到了同样的错误!
我讨厌这样做,因为它一开始就缺乏耐心,但这个答案可能对其他人有帮助,我用两种方式解决了我的问题,第一种是决定显示顺序(降序或升序)的查询然后允许我使用 flask-paginate 在多个页面上显示结果,我意识到我正在处理一个列表,其中一位开发人员的示例 link 向我展示了方法,这是我的代码,
from flask_paginate import Pagination, get_page_args
@bp.route('/stock', methods=['GET', 'POST'])
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
stocks = Stock.query.order_by(Stock.id.desc())# this gives order of results
forms = []
def get_forms(offset=0, per_page=25): #this function sets up the number of
return forms[offset: offset + per_page] #results per page
for stock in stocks:
form = AddStockForm()
form.id.default = stock.id
form.image.default = stock.image_url
form.date.default = stock.date
form.description.default = stock.description
form.event.default = stock.event
form.achat.default = stock.achat
form.vente.default = stock.vente
form.sold.default = stock.sold
forms.append(form)
for form in forms:
if form.validate_on_submit():
if form.modify.data:
stock = Stock.query.filter_by(id=form.id.data).one()
stock.date = form.date.data
stock.description = form.description.data
stock.event = form.event.data
stock.achat = form.achat.data
stock.vente = form.vente.data
stock.sold = form.sold.data
db.session.add(stock)
db.session.commit()
elif form.delete.data:
stock = Stock.query.filter_by(id=form.id.data).one()
db.session.delete(stock)
db.session.commit()
return redirect(url_for('stock.stock'))
#this is the code from the link that I used to paginate
page, per_page, offset = get_page_args(page_parameter='page',
per_page_parameter='per_page')
total = len(forms) # this code counts the resulting list to be displayed
pagination_forms = get_forms(offset=offset, per_page=per_page)
pagination = Pagination(page=page, per_page=per_page, total=total)
form.process() # Do this after validate_on_submit or breaks CSRF token
return render_template('stock/stock.html', title=Stock, stocks=stocks
page=page, forms=pagination_forms, per_page=per_page, pagination=pagination)
#And finally this is the pagination passed to the html
所以这对于所有像我这样努力奋斗但仍然热爱它的麻木者。
有人在这里用一些很棒的代码帮助我多次显示相同的表单,每次都有一个提交按钮,这很有效,但是由于我将有数百个表单,我需要对页面进行分页,所以我一直过去能够对页面进行分页,但我不知道如何在 for 循环中使用该代码和表单。 这是我的代码:(在 Greg 的帮助下)
@bp.route('/stock', methods=['GET', 'POST'])
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
stocks = Stock.query.all()
forms = []
for stock in stocks:
form = AddStockForm()
form.id.default = stock.id
form.image.default = stock.image_url
form.date.default = stock.date
form.description.default = stock.description
form.event.default = stock.event
form.achat.default = stock.achat
form.vente.default = stock.vente
form.sold.default = stock.sold
forms.append(form)
for form in forms:
if form.validate_on_submit():
if form.modify.data:
stock = Stock.query.filter_by(id=form.id.data).one()
stock.date = form.date.data
stock.description = form.description.data
stock.event = form.event.data
stock.achat = form.achat.data
stock.vente = form.vente.data
stock.sold = form.sold.data
db.session.add(stock)
db.session.commit()
elif form.delete.data:
stock = Stock.query.filter_by(id=form.id.data).one()
db.session.delete(stock)
db.session.commit()
return redirect(url_for('stock.stock'))
form.process() # Do this after validate_on_submit or breaks CSRF token
page = request.args.get('page', 1, type=int)
forms = forms[1].id().paginate(
page, current_app.config['ITEMS_PER_PAGE'], False)
next_url = url_for('stock.stock', page=forms.next_num) \
if forms.has_next else None
prev_url = url_for('stock.stock', page=forms.prev_num) \
if forms.has_prev else None
return render_template('stock/stock.html',forms=forms.items, title=Stock, stocks=stocks)
我正在尝试使用事实 "forms" 是一个列表来对结果进行分页,我显然不明白该怎么做,我看过 flask-paginate 但我也不明白! 非常需要所有帮助 热烈的问候,保罗。
编辑 我尝试使用 flask_pagination,这是我的代码:
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
search = False
q = request.args.get('q')
if q:
search = True
page = request.args.get(get_page_parameter(), type=int, default=1)
stocks = Stock.query.all()
forms = []
#rest of code here#
pagination = Pagination(page=page, total=stocks.count(), search=search, record_name='forms')
form.process() # Do this after validate_on_submit or breaks CSRF token
return render_template('stock/stock.html',forms=forms, title=Stock, pagination=pagination)
这给出了不同的错误 "TypeError: count() takes exactly one argument (0 given)" 我也尝试过 "total=forms.count()" 并得到了同样的错误!
我讨厌这样做,因为它一开始就缺乏耐心,但这个答案可能对其他人有帮助,我用两种方式解决了我的问题,第一种是决定显示顺序(降序或升序)的查询然后允许我使用 flask-paginate 在多个页面上显示结果,我意识到我正在处理一个列表,其中一位开发人员的示例 link 向我展示了方法,这是我的代码,
from flask_paginate import Pagination, get_page_args
@bp.route('/stock', methods=['GET', 'POST'])
@bp.route('/stock/stock/', methods=['GET', 'POST'])
@login_required
def stock():
stocks = Stock.query.order_by(Stock.id.desc())# this gives order of results
forms = []
def get_forms(offset=0, per_page=25): #this function sets up the number of
return forms[offset: offset + per_page] #results per page
for stock in stocks:
form = AddStockForm()
form.id.default = stock.id
form.image.default = stock.image_url
form.date.default = stock.date
form.description.default = stock.description
form.event.default = stock.event
form.achat.default = stock.achat
form.vente.default = stock.vente
form.sold.default = stock.sold
forms.append(form)
for form in forms:
if form.validate_on_submit():
if form.modify.data:
stock = Stock.query.filter_by(id=form.id.data).one()
stock.date = form.date.data
stock.description = form.description.data
stock.event = form.event.data
stock.achat = form.achat.data
stock.vente = form.vente.data
stock.sold = form.sold.data
db.session.add(stock)
db.session.commit()
elif form.delete.data:
stock = Stock.query.filter_by(id=form.id.data).one()
db.session.delete(stock)
db.session.commit()
return redirect(url_for('stock.stock'))
#this is the code from the link that I used to paginate
page, per_page, offset = get_page_args(page_parameter='page',
per_page_parameter='per_page')
total = len(forms) # this code counts the resulting list to be displayed
pagination_forms = get_forms(offset=offset, per_page=per_page)
pagination = Pagination(page=page, per_page=per_page, total=total)
form.process() # Do this after validate_on_submit or breaks CSRF token
return render_template('stock/stock.html', title=Stock, stocks=stocks
page=page, forms=pagination_forms, per_page=per_page, pagination=pagination)
#And finally this is the pagination passed to the html
所以这对于所有像我这样努力奋斗但仍然热爱它的麻木者。