【发布时间】:2023-01-16 19:11:16
【问题描述】:
我创建了一个 Flask 应用程序,使用 SQLite、SQLAlchemy 和 WTForms。我的目标是创建分类类别树,以便站点用户使用 HTML 表单,例如: 1 类别 1 子类别 2 子类别 .... 2 类别 ....
我在使用 WTForms 时遇到问题查询选择字段在我的表单中(form.validate_on_submit():)。 打开表单页面后,报错:KeyError: <weakref at 0x7f37bb9587c0;到 0x7f37be04ef20 处的“烧瓶”>
详细信息 3 个文件:主运行.py
from flask import Flask, render_template, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
import formsrun
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
app = Flask(__name__)
app.config['SECRET_KEY'] = 'xxxxx'
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///todobudjet34.db"
db = SQLAlchemy(app)
class CategoryGroup(db.Model):
__tablename__ = "category_group"
id = db.Column(db.Integer, primary_key=True)
category_group = db.Column(db.String(200), unique= True)
category_add = db.relationship("MyCategory")
class MyCategory(db.Model):
__tablename__ = "mycategory"
id = db.Column(db.Integer, primary_key=True)
cat_gr_id = db.Column(db.Integer, db.ForeignKey('category_group.id'))
my_category_name = db.Column(db.String(200), unique = True)
my_sub_category_add = db.relationship("SubCategory")
my_sub_directory_cat_add = db.relationship("SubDirectoryCat")
with app.app_context():
db.create_all()
@app.route("/")
def index():
return render_template("index.html")
@app.route("/categories")
def categories():
try:
categories = MyCategory.query.all()
except:
categories = []
return render_template("categories.html", categories=categories)
@app.route("/newcategory", methods=["GET", "POST"])
def newcategory():
db.create_all()
forma = formsrun.CategoryForm()
if forma.validate_on_submit():
category = MyCategory(cat_gr_id=forma.category_group_source.data.id, my_category_name=forma.my_categ.data)
db.session.add(category)
db.session.commit()
return redirect(url_for('categories'))
return render_template("newcategory.html", form=forma)
if __name__ == '__main__':
app.run(host='127.0.0.1', port=8050, debug=True)
表单运行.py:
from flask_wtf import FlaskForm
from wtforms import StringField, IntegerField, SubmitField, SelectField, FloatField
from wtforms.validators import DataRequired, Email, InputRequired
from wtforms_sqlalchemy.fields import QuerySelectField, QuerySelectMultipleField
import mainrun
def get_pk(obj):
return str(obj)
def category_group_query():
return mainrun.CategoryGroup.query
def category_query():
return mainrun.MyCategory.query
class CategoryGroupForm(FlaskForm):
my_category_group = StringField('My category group name', [DataRequired ()])
submit = SubmitField("Enter")
class CategoryForm(FlaskForm):
category_group_source = QuerySelectField(query_factory=category_group_query, get_label="category_group", get_pk=get_pk)
my_categ = StringField('My category name', [DataRequired()])
submit = SubmitField("Enter")
新类别.html
{% extends "base.html" %} {% block content %}
<form method="post" action="#">
{{ form.hidden_tag() }}
<div class="form-group">
{{ form.category_group_source.label(class="form-control-label") }} {{
form.category_group_source(class="form-control") }}
</div>
<div class="form-group">
{{ form.my_category.label(class="form-control-label") }} {{
form.my_category(class="form-control") }}
</div>
{{ form.submit }}
</form>
{% endblock %}
我明白问题出在这里: category = MyCategory(cat_gr_id=forma.category_group_source.data.id, my_category_name=forma.my_categ.data) 在主运行.py, 和 query_factory 在表单运行.py
但无法解决此问题,请帮助解决此问题:)
【问题讨论】:
-
您使用的是哪个版本的 Flask 和 SQLAlchemy?
标签: wtforms