Flask-WTForms - 简单的CRUD示例 - 值不填充表单

Dav*_*vid 1 python flask flask-wtforms

我已经阅读了我能找到的每个教程和一些文档,但找不到我的问题.我以"公司"为例,尽可能简化了这一点.当我加载我的/ company/edit/2 url时,表单不会填充该值.

视图

@app.route('/company/edit/<id>')
def company_edit(id):
  company = {'id': 2, 'company_name': 'SomeCo'} #dummy object
  form = CompanyForm(obj=company)
  #form = CompanyForm(None, company) #tried this too, based on API
  return render_template('company_form.html', form = form)
Run Code Online (Sandbox Code Playgroud)

形式对象

class CompanyForm(Form):
  company_name = TextField('company_name', validators = [Required()])
Run Code Online (Sandbox Code Playgroud)

表单模板

<!-- extend base layout -->
{% extends "base.html" %}

{% block content %}

<form action="" method="post" name="login">
    {{form.hidden_tag()}}
    <p>
        Company Name:<br>
        {{form.company_name(size=80)}}<br>
    </p>
    <p><input type="submit" value="Sign In"></p>
</form>

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我的理解是这应该工作 - 路由/公司/编辑/ x将调用company_edit(x),它声明虚拟公司对象(稍后从数据库中提取),实例化表单,传递公司对象,然后渲染传递表单的模板.表单模板应该能够匹配公司对象中的字段名称,表单对象中的相应输入名称,并使用值"SomeCo"填充文本字段.我错过了一些明显的东西吗

谢谢!

Sea*_*ira 6

obj传递给WTForms实例关键字需要有属性,没有密钥(换句话说,它需要应对__getattr____getitem__).如果要将类似字典的对象传递给您Form,则需要使用splat operator(**)将字典作为关键字参数传递:

form = CompanyForm(**company)
Run Code Online (Sandbox Code Playgroud)