烧瓶编辑表单提交不可靠

时间:2019-01-20 20:08:34

标签: python flask routes submit

对象

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()

任何没有进展的人:(

错了吗?

1 个答案:

答案 0 :(得分:0)

我确定了问题:

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

  2. 当我发布问题时,也简化了问题的描述。 Realy 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的验证参数。

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

如果有人对这些东西之间如何关联或我错了什么有任何想法,请告诉我。我不想在知识上留下空白。