繁体   English   中英

Python Flask 动态选择 SelectField

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM