2011-06-01 122 views
5

我有一個允許用戶編輯其用戶信息的模板。在Flask微型框架中使用WTForms的populate_obj()方法

<form method="post"> 
    <table> 
     <tr> 
      <td>Username:</td> 
      <td>{{user['username']}}</td> 
     </tr> 
     <tr> 
      <td>New Password:</td> 
      <td> <input type="password" name="password"></td> 
      <td>{% if form.password.errors %} {{form.password.errors}} {% endif %}<td> 
     </tr> 
     <tr> 
      <td>Re-enter Password:</td> 
      <td> <input type="password" name="confirm_password"> 
      </td> 
     </tr> 
     <input type='hidden' name='username' value="{{user['username']}}"> 
     <tr> 
      <td><input type="submit" value="Submit"></td> 
     </tr> 
    </table> 
</form> 

我也有一個視圖函數來處理用戶的這種編輯。我目前使用的數據庫是MongoDBMongoKit模塊。我只能在視圖函數中做到這一點,但沒有運氣。

def edit(): 
    username = request.args.get('user') 
    user = User.find_one({'username':username}) # Is this a correct way of doing it? 
    form = UserForm(**what should be placed here?**, obj=user) 

    if request.method == 'POST' and form.validate(): 
     form.populate_obj(user) 
     user.save() 
     return 'updated' 
    return render_template('edituser.html', form=form, user=user) 

我正在通過populate_obj(obj)爲此目的。我在這件事上找不到多少幫助。我應該怎麼做才能獲得populate_obj()的工作?

+0

你需要描述你得到的錯誤,或者你得到的結果與你的期望有什麼不同。 – 2011-06-01 06:58:38

+0

我希望是否有人會指出我應該保留哪些地方我應該放置在哪裏?**。關於從這種方式獲得的用戶對象也被允許通過或不通過。 – consumer 2011-06-01 09:35:23

回答

15

UserForm應該將request.form傳遞給它,以便使用POST請求中可用的值填充它(如果有的話)。

form = UserForm(request.form, obj=user) 
+9

只有原生的'WTForms'。 'Flask-WTF'不需要額外的'request.form'。 – Sean 2011-06-03 22:38:12

+5

@Sean - True ...這是爲什麼'Flask-WTF'是一個很好的擴展的一部分;它有助於切割樣板。但OP沒有使用'Flask-WTF',所以推薦他使用它有點類似於建議使用jQuery來解決JavaScript問題。這將意味着你的問題爲你解決 - 但這個問題已經解決了**你** ... **你**仍然不知道如何解決它。這就是爲什麼我只給OP這種方式來完成他所需要的Flask和WTForms(你已經非常好地指出了'Flask-WTF'的優點,並且我給了你一個+1; - ))。 – 2011-06-03 23:38:37

+0

*點頭*更正谷歌餅乾比其他任何更正。也就是說,如果用戶在開發(vs維護)期間遇到問題,那麼現在就可以比較容易地提出讓生活更輕鬆的事情。 :〜] – Sean 2011-06-03 23:41:36

6

您使用的是​​?如果是這樣,請查看下面的示例代碼:

https://github.com/sean-/flask-skeleton/blob/master/skeleton/modules/aaa/views.py#L13

具體來說,您可以:

def edit(): 
    form = UserForm() 
    if form.validate_on_submit(): 
     # Commit your form data 

底線,如果你使用Flask-WTF,我不知道你的問題是什麼。如果您未使用Flask-WTF,請使用Flask-WTF

+0

「底線,如果你使用Flask-WTF,我不確定你的問題是什麼,如果你沒有使用Flask-WTF,請使用Flask-WTF。」 我完全同意最後一句話。如果您不使用Flask-WTF,請使用Flask-WTF。 – Depado 2014-02-18 11:29:31

+1

在這個例子中很難看到發生了什麼,因爲你在做自定義的SQLA而不是普通的'db.session.commit()':) – 2015-09-09 13:07:02

1

在燒瓶WTF的情況下,你可以編寫

form = UserForm(obj=user) 

吳丹將工作!