【问题标题】:Flask edit form submit trubleFlask编辑表单提交麻烦
【发布时间】:2019-06-14 06:49:43
【问题描述】:

对象

class MyObj:    
    def __init__(self, data_dict):
        self.id = ''
        self.name = ''
        self.minDescription = ''
        self.descriptions = ''

class MyObjForm(Form):
    name = StringField('name')
    minDescription = StringField('minDescription')
    descriptions = TextAreaField('descriptions')

路由

这在“POST”和“GET”模式下做得很好。提交按钮点击时反应良好。

@app.route("/create", methods=["GET", "POST"])
@login_required
def create():
    if request.method == 'POST':
        form = MyObjForm(request.form)
        if form.validate():
            new_obj = MyObj(request.form)
            return redirect(url_for("/"))
        else:
            return render_template('create.html', form=form)
    else:
        return render_template('create.html', form=MyObjForm())

当我在“GET”模式下路由时,我的代码运行良好,查看有旧的对象数据,但点击提交按钮没有任何反应。

@app.route("/edit/<id>", methods=["GET", "POST"])
@login_required
def edit(id):
    if request.method == 'GET':
        old_obj = d.get_by_id(id)
        form = MyObjForm(obj=old_obj)
        return render_template('create.html', form=form, id=id)
    else:
        #never entry
        pass

HTML 'create.html'

<form method="post" role="form">
    {{ form.csrf }}
    {{ macros.render_field(form.name) }}
    {{ macros.render_field(form.minDescription) }}
    {{ macros.render_field(form.descriptions) }}
    <input class="btn special" type="submit" value="Save"/>
</form>

我试试这个:

<form method="post" role="form" action="{{ url_for('edit', id=id) }}">

还有这个:

class MyObjForm(Form):    
id = StringField()

任何没有进展:(

错了吗?

【问题讨论】:

  • 我无法理解您的问题到底是什么。你有错误吗?如果不是,您期望什么行为不存在。此外,您在 MyObjForm 课程中的缩进已关闭。
  • 我没有收到任何错误。我希望我可以使用一个 html 模板来实现添加和编辑产品的方法。但是在产品编辑的情况下,表单不会进入编辑方法,并且当您单击保存按钮时不会发生任何事情。
  • 我发现了问题:) 如果在 MyObjForm 创建保存按钮时不使用 args ('obj=new_obj') 在发布模式下调用我的路线 :) 但是现在我的表单中没有数据想改变:(

标签: python flask routes submit


【解决方案1】:

我发现了问题:

  1. 如果在 MyObjForm 创建保存按钮时不使用 args ('obj=new_obj') 也会在发布模式下调用我的路线

  2. 当我发布问题时,问题的描述过于简单。真正的 MyObjForm 包括 BooleanField:

    class MyObjForm(Form): name = StringField('name') minDescription = StringField('minDescription') descriptions = TextAreaField('descriptions') isArchive = BooleanField('Is not public')

  3. 我没有注意到该复选框因我不知道的原因停止显示在表单上。输出使用标准渲染方式:

    {{ macros.render_field2(form.isArchive) }}
    {% macro render_field2(field) %} {{ field.label }} {{ field(**kwargs)|safe }} {% if field.errors %} {% for error in field.errors %} {{ error }} {% endfor %} {% endif %} {% endmacro %}

  4. 为了解决可视化问题,应用了以下方法:

    <input type="checkbox" id="isArchive" name="isArchive"> <label for="isArchive">{{ form.isArchive.label }}</label> {% for error in form.isArchive.errors %} <li><font color="red">{{ error }}</font></li> {% endfor %}

  5. 最后一件事。没有注意到如何,但是当你添加一个对象时表单也停止工作,不再通过验证。原因是{{ form.csrf }}} 必须替换为{{ form.csrf_token() }}。仍然必须删除 BooleanField 的验证参数。

现在问题部分解决了。我将这些问题与安装烧瓶安全组件相关联。不幸的是,我无法正常显示复选框,但至少我可以继续前进。

如果有人知道这些事情如何相互关联或我错了什么,请告诉我。我不想留下知识空白。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2018-01-14
    • 2016-08-06
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多