根据其他形式的价值在循环中重复烧瓶形式

Repeat flask form in loop based on other form's value

我正在尝试使用表单 (ProjectForm) 中的值 (n) 在循环中生成第二个表单 (StepForm) n 次。 ProjectForm 工作,创建一个项目和 然后将我发送到 StepForm,但在提交时 StepForm 不会更新并且循环永远不会停止。

@app.route("/new_project", methods=("POST", "GET"))
@login_required
def post_project():
    form = forms.ProjectForm()
    if form.validate_on_submit():
        models.Project.create(user=g.user.id,
                              title=form.title.data,
                              steps_number = form.steps_number.data,
                              description=form.description.data.strip())
        flash("Project created", "success")
        if form.steps_number.data != 0:
            project = models.Project.select().where(models.Project.title == form.title.data).get()
            return redirect(url_for("add_step",project_id=project.id))
        if form.steps_number.data == 0:
            return redirect(url_for("projects"))
    return render_template("post_project.html", form=form)

@app.route("/new_step/<int:project_id>", methods=("POST", "GET"))
@login_required
def add_step(project_id):
    form = forms.StepForm()
    project = models.Project.select().where(models.Project.id == project_id).get()
    steps = 0
    for i in range(0,project.steps_number):
        steps+=1
        if form.validate_on_submit():
            models.Step.create(project=project.id,
                                    title=form.title.data.strip(),
                                    instruction=form.instruction.data.strip())
            flash("Step Added", "success")
            if project.steps_number == steps:
                return redirect(url_for("projects"))
        return render_template("add_step.html", form=form, step=steps)

已解决请参阅下面的答案

@app.route("/new_project", methods=("POST", "GET"))
@login_required
def post_project():
    form = forms.ProjectForm()
    if form.validate_on_submit():
        models.Project.create(user=g.user.id,
                              title=form.title.data,
                              steps_number = form.steps_number.data,
                              description=form.description.data.strip())
        flash("Project created", "success")
        if form.steps_number.data != 0:
            project = models.Project.select().where(models.Project.title == form.title.data).get()
            return redirect(url_for("add_step",project_id=project.id,step_id=1))
        if form.steps_number.data == 0:
            return redirect(url_for("projects"))
    return render_template("post_project.html", form=form)

@app.route("/new_step/<int:project_id>/<int:step_id>", methods=("POST", "GET"))
@login_required
def add_step(project_id,step_id):
    project = models.Project.select().where(models.Project.id == project_id).get()
    form = forms.StepForm()
    step = step_id
    if form.validate_on_submit():
        models.Step.create(project=project.id,
                            title=form.title.data.strip(),
                            instruction=form.instruction.data.strip())
        flash("Step Added", "success")
        step +=1
        return redirect(url_for("add_step",project_id=project.id,step_id=step))
    if project.steps_number == step:
                return redirect(url_for("projects"))
    return render_template("add_step.html", form=form, step_id=step)

你不能在循环中有 return 并期望循环工作

def f():
    for i in range(100):
        return i

f()
# >>> 0

您的页面和路由需要响应式,因此将当前步骤编号作为渲染参数传递给页面: render_template("add_step.html", form=form, step=steps) 然后将该数字传回添加步骤路由和输入参数并删除不起作用的内部循环:

@app.route("/new_step/<int:project_id>/<int:step>", methods=("POST", "GET"))
@login_required
def add_step(project_id, step):

您需要更新表单操作 html link 以包含步骤