[英]Python Flask dynamic choices SelectField
我終於得到了動態選擇字段,它顯示了您選擇的那個類別的子類別。 現在唯一的問題是,每當我想存儲條目並提交時,它只會重新加載頁面並重置子類別,並且不會讓我存儲新條目。
這是我遵循的教程:
應用程序.py
from flask import Flask, render_template, request, jsonify
from flask_sqlalchemy import SQLAlchemy
from flask_wtf import FlaskForm
from wtforms import SelectField
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
app.config['SECRET_KEY'] = 'secret'
db = SQLAlchemy(app)
class City(db.Model):
id = db.Column(db.Integer, primary_key=True)
state = db.Column(db.String(2))
name = db.Column(db.String(50))
class Form(FlaskForm):
state = SelectField('state', choices=[('CA', 'California'), ('NV', 'Nevada')])
city = SelectField('city', choices=[])
@app.route('/', methods=['GET', 'POST'])
def index():
form = Form()
form.city.choices = [(city.id, city.name) for city in City.query.filter_by(state='CA').all()]
if request.method == 'POST':
city = City.query.filter_by(id=form.city.data).first()
return '<h1>State: {}, City: {}</h1>'.format(form.state.data, city.name)
return render_template('index.html', form=form)
@app.route('/city/<state>')
def city(state):
cities = City.query.filter_by(state=state).all()
cityArray = []
for city in cities:
cityObj = {}
cityObj['id'] = city.id
cityObj['name'] = city.name
cityArray.append(cityObj)
return jsonify({'cities' : cityArray})
if __name__ == '__main__':
app.run(debug=True)
索引.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<form method="POST">
{{ form.csrf_token }}
{{ form.state }}
{{ form.city }}
<input type="submit">
</form>
<script>
var state_select = document.getElementById("state");
var city_select = document.getElementById("city");
state_select.onchange = function() {
state = state_select.value;
fetch('/city/' + state).then(function(response) {
response.json().then(function(data) {
var optionHTML = '';
for (var city of data.cities) {
optionHTML += '<option value="' + city.id + '">' + city.name + '</option>';
}
city_select.innerHTML = optionHTML;
})
});
}
</script>
</body>
</html>
這就是我的代碼的樣子:
@app.route("/data/create", methods=["GET", "POST"])
def create():
form = NewEntry()
if form.validate_on_submit():
form.Unterkategorie.choices = [
(Unterkategorie.Name, Unterkategorie.Name)
for Unterkategorie in Unterkg.query.filter_by(
Kategorie="01_GENERAL_REQUIREMENTS"
).all()
]
employee = WissenModel(
Kategorie=form.Kategorie.data,
Unterkategorie=form.Unterkategorie.data,
)
db.session.add(employee)
db.session.commit()
flash(f"Eintrag hinzugefügt!", "success")
return redirect(url_for("RetrieveList"))
return render_template("createpage.html", form=form, title="New Entry")
@app.route("/Unterkategorie/<Kategorie>")
def Unterkategorie(Kategorie):
Unterkategorien = Unterkg.query.filter_by(Kategorie=Kategorie).all()
UnterkategorieArray = []
for Unterkategorie in Unterkategorien:
UnterkategorieObj = {}
UnterkategorieObj["id"] = Unterkategorie.id
UnterkategorieObj["Name"] = Unterkategorie.Name
UnterkategorieArray.append(UnterkategorieObj)
return jsonify({"Unterkategorien": UnterkategorieArray})
我的代碼缺少這部分:
if request.method == 'POST':
city = City.query.filter_by(id=form.city.data).first()
但是當我有if form.validate_on_submit():
我不應該需要if request.method == 'POST':
對嗎?
嘗試使用 form.is_submitted(),然后保存 form.name。 也許這會有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.