Skip to main content
 首页 » 编程设计

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

2025年05月04日15lidabo

我已经阅读了我能找到的所有教程和一些文档,但找不到我的问题。我已尽可能简单地使用“公司”作为示例。当我加载我的/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) 

表单对象

class CompanyForm(Form): 
  company_name = TextField('company_name', validators = [Required()]) 

表单模板

<!-- 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 %} 

我的理解是这应该可行——路由/company/edit/x 将调用 company_edit(x),它声明虚拟公司对象(稍后从数据库中提取),实例化一个表单,传递公司对象,然后呈现传递表单的模板。表单模板应该能够将公司对象中的字段名称与表单对象中相应的输入名称相匹配,并使用值“SomeCo”填充文本字段。我是否遗漏了一些明显的东西?

谢谢!

请您参考如下方法:

传递给 WTForms 实例的 obj 关键字需要有属性,而不是键(换句话说,它需要响应 __getattr__ 而不是 __getitem__)。如果您想将类似字典的对象传递到您的 Form 中,您需要使用 splat 运算符 (**) 将您的字典作为关键字参数传递:

form = CompanyForm(**company)