Склянка Python WTF формы: шаблон визуализации ошибка ошибка слишком много значений распакованы - PullRequest
0 голосов
/ 07 октября 2019

Я получаю ошибку

ValueError: too many values to unpack (expected 2)

с кодом

form = ChoiceForm()
tasks = Todo.query.order_by(Todo.date_created).all()
return render_template('index.html', tasks=tasks, form=form)

это после того, как я добавил бит

form=form

в строку render_template.

Раньше все работало нормально, но сейчас я пытаюсь работать с wtf_forms, если я не добавляю form = form в качестве аргумента, я получаю ошибку

jinja2.exceptions.UndefinedError: 'form' is undefined

myполный код ниже

from flask import Flask, render_template, url_for, request, redirect
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from flask_wtf import FlaskForm
from wtforms_sqlalchemy.fields import QuerySelectField

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SECRET_KEY'] = 'secret' 
db = SQLAlchemy(app)

class Todo(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    item = db.Column(db.String(200), nullable=False)
    amount = db.Column(db.Float, nullable=False)
    date_created = db.Column(db.DateTime, default=datetime.utcnow)

    def __repr__(self):
        return '<Item %r>' % self.id

class nutritionalvalues(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    item = db.Column(db.String(200), nullable=False)
    calories = db.Column(db.Float, nullable=False)
    totalfat = db.Column(db.Float, nullable=False)

    def __repr__(self):
        return '<Item {}>'.format(self.item)

def choice_query():
    return nutritionalvalues.query

class ChoiceForm(FlaskForm):
    options = QuerySelectField(query_factory=choice_query, allow_blank=False)   


@app.route('/', methods=['POST', 'GET'])
def index():
    if request.method == 'POST':
        task_item = request.form['item']
        task_amount = request.form['amount']
        new_task = Todo(item=task_item, amount=task_amount)

        try:
            db.session.add(new_task)
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue adding your task'

    else:
        form = ChoiceForm()
        tasks = Todo.query.order_by(Todo.date_created).all()
        return render_template('index.html', tasks=tasks, form=form)



@app.route('/delete/<int:id>')
def delete(id):
    task_to_delete = Todo.query.get_or_404(id)

    try:
        db.session.delete(task_to_delete)
        db.session.commit()
        return redirect('/')
    except:
        return 'There was a problem deleting that task'

@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    task = Todo.query.get_or_404(id)

    if request.method == 'POST':
        task.item = request.form['item']
        task.amount = request.form['amount']

        try:
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue updating your task'

    else:
        return render_template('update.html', task=task)


@app.route('/foods', methods=['GET', 'POST'])
def foods():
    if request.method == 'POST':
        food_item = request.form['item']
        food_calorie = request.form['calories']
        food_totalfat = request.form['totalfat']
        new_food = nutritionalvalues(item=food_item, calories=food_calorie, totalfat=food_totalfat)

        try:
            db.session.add(new_food)
            db.session.commit()
            return redirect('/foods')
        except:
            return 'There was an issue adding your food item'

    else:
        foods = nutritionalvalues.query.order_by(nutritionalvalues.item).all()
        return render_template('foods.html', foods=foods)


if __name__ == "__main__":
    app.run(debug=True)

РЕДАКТИРОВАТЬ: и вот сообщение об ошибке в полном объеме

Traceback (most recent call last)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 2463, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 2449, in wsgi_app
response = self.handle_exception(e)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 1866, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 2446, in wsgi_app
response = self.full_dispatch_request()
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 1951, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 1820, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 1949, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/app.py", line 1935, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/benjamattesjaroen/helloPython/app.py", line 54, in index
return render_template('index.html', tasks=tasks, form=form)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/templating.py", line 140, in render_template
ctx.app,
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/flask/templating.py", line 120, in _render
rv = template.render(context)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/jinja2/asyncsupport.py", line 76, in render
return original_render(self, *args, **kwargs)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/jinja2/environment.py", line 1008, in render
return self.environment.handle_exception(exc_info, True)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/jinja2/environment.py", line 780, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/jinja2/_compat.py", line 37, in reraise
raise value.with_traceback(tb)
File "/Users/benjamattesjaroen/helloPython/templates/index.html", line 1, in top-level template code
{% extends 'base.html' %}
File "/Users/benjamattesjaroen/helloPython/templates/base.html", line 13, in top-level template code
{% block body %}{% endblock %}
File "/Users/benjamattesjaroen/helloPython/templates/index.html", line 37, in block "body"
{{ form.options }}
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms/fields/core.py", line 139, in __html__
return self()
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms/fields/core.py", line 155, in __call__
return self.meta.render_field(self, kwargs)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms/meta.py", line 56, in render_field
return field.widget(field, **render_kw)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms/widgets/core.py", line 323, in __call__
for val, label, selected in field.iter_choices():
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms_sqlalchemy/fields.py", line 107, in iter_choices
for pk, obj in self._get_object_list():
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms_sqlalchemy/fields.py", line 100, in _get_object_list
self._object_list = list((text_type(get_pk(obj)), obj) for obj in query)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms_sqlalchemy/fields.py", line 100, in <genexpr>
self._object_list = list((text_type(get_pk(obj)), obj) for obj in query)
File "/Users/benjamattesjaroen/helloPython/env/lib/python3.7/site-packages/wtforms_sqlalchemy/fields.py", line 189, in get_pk_from_identity
cls, key = identity_key(instance=obj)
ValueError: too many values to unpack (expected 2)
...