为什么我的编辑/更新路线会中断?

时间:2015-11-07 03:20:51

标签: python flask

我正在使用Flask框架创建一个非常简单的应用程序。我顺利进行,直到我为Employee模型创建编辑/更新路线。我想要做的是让员工更新他们的信息,当他们点击提交时,sql_alchemy就会发挥作用。我遇到的问题是我的编辑网址正在破坏其工作的地方。我一直在寻找我的应用,但我似乎无法让它发挥作用。这是我编辑/更新操作的相关代码:

    @app.route('/edit_employee/<id>', methods=['GET','PUT'])
    def edit_employee(id):

    if request.method == 'GET':
        employee = Employee.query.get(id)
        return render_template('edit.html', employee=employee)
    else:
        existing_employee = Employee.query.get(id)
        updated_employee = Employee(request.form['name'], request.form['title'],
                            request.form['email'], request.form['department'])
        file = request.files['profile_image']
        if file and allowed_file(file.filename):
            filename = secure_filename(file.filename)
            filename = updated_employee.name
            # Destroy the old image first
            os.remove(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        existing_employee = updated_employee
        db.session.commit()
        return redirect(url_for('all_employees'))

这是一个layout.html文件。我怀疑问题是在我的form_action块中,但我不确定。我只粘贴了我的html视图的一部分(它本质上是一个带有属性的表单)。

<body> 
<div>
  <form{% block form_action %}{% endblock %}>
    <h2>{% block h2 %}{% endblock %}</h2>
    <div class="control-group">
      <div class="controls">
        <label>Name</label>
        <input type="text" id="name" name="name"
          placeholder="Specify name" value="{{ request.form.name }}"
          required>
          .............

我的编辑视图:

{% extends "layout.html" %}
{% block h2 %}Edit a Blackduck employee{% endblock %}
{% block form_action %}action="{{ url_for('edit_employee') }}" enctype=multipart/form-data method=post class="form-horizontal"{% endblock %}
{% block submit %}Update{% endblock %}

我已经和Rails和Sinatra合作了一段时间了,我根本不习惯Flask的错误渲染。对于此错误BuildError: ('edit_employee', {}, None),我无法准确地说出与Rails不同的问题。帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

错误在于您正在尝试访问名为edit_employee且路由为零的路由,但这样的路由不存在。您的edit_employee路由接受<id>参数,因此您需要像这样调用路由:

{{ url_for('edit_employee', id = id) }}