2013-05-14 55 views
2

我有成员场模型,如下图所示:如何跟踪Flask-WTF中的表单字段更改?

class Team(db.Model): 
    --- some fields --- 
    members = ListProperty(db.Key) # Using App Engine datastore as backend. 

我用的烧瓶WTFforms采用这种模式来创建表单。在创建新的Team时,用户将选择表单中的一些成员并保存。用户还可以编辑团队表格并更改成员字段(可以添加或删除成员)。我想通过比较存储在成员字段中的先前数据来检查添加或删除了多少成员。同样适用于其他领域。

我使用的会话来实现这一目标:

高清edit_team(键):

k = db.Key(key) 
team = db.get(k) 
form = TeamForm(obj = team) 
if not form.is_submitted(): # Indicates GET request 
    session[str(g.user.user_id() + 'prev_members'] = form.members.data 
if form.validate_on_submit(): 
    form.populate_obj(project) 
    # I will use session data with new form.members.data to do further processing. 

这是处理这种情况的正确方法? 谢谢你的任何帮助..

回答

0

与您的代码的问题是

team = db.get(k) 
form = TeamForm(obj = team) 

如果请求GET,对象的数据已被从模型加载。但是,如果请求是POST(或PUT,PATCH),这意味着您需要读取请求正文以形成适当的模型更新。看起来你正在使用k变量作为模型指标的关键。

k = db.Key(key) 
team = db.get(k) 
if request.method == "GET": 
    # create form from the model 
    form = TeamForm(obj = team) 

elif request.method == "POST": 
    # update model with the form 
    form = TeamForm() #flask-wtf automatically reads from request object 
    # validate, update, delete, ... 
+0

感谢您的回答。我的方法与您的方法相同。如果validate_on_submit()为False,则它被视为GET请求,并且使用form = TeamForm(obj = team)构造表单,如果validate_on_submit()为True,则它被视为POST请求。我想在GET请求中保存表单数据并在POST请求中处理它。我也可以跟踪发生了什么变化。 更多关于validate_on_submit():该方法依次调用form.is_submitted()和form.validate()。 is_submitted()方法是区分POST和POST的方法。 – rajpy 2013-05-14 09:41:27