2017-02-19 30 views
0

user_edit_profile.html:無法獲得數據從WTForms FormField回validate_on_submit

{% extends "base.html" %} 
{% import "bootstrap/wtf.html" as wtf %} 
{% block mainbody %} 
    <div class="container"> 
     <div class="col-md-8 col-md-offset-2"> 
      <div class="page-header"> 
       <h3>{{ _('User Edit Profile') }}</h3> 
      </div> 
      <div> 
       {{ wtf.quick_form(form, form_type="horizontal", horizontal_columns=('md', 3, 9)) }} 
      </div> 
     </div> 
    </div> 
{% endblock %} 

forms.py

from flask_wtf import FlaskForm 
from wtforms import Form 
class UserBasicInfoForm(Form): 
    surname = StringField(lazy_gettext("Surname"), validators=[Length(0, 64)]) 

class UserEditProfileForm(FlaskForm): 
    basic_information = FormField(UserBasicInfoForm) 
    submit = SubmitField(lazy_gettext("Submit"), id="user_edit_profile_submit") 

user.py

@user.route("/edit-profile", methods=["GET", "POST"]) 
@login_required 
def edit_profile(): 
    form = UserEditProfileForm() 
    form.basic_information.surname.data = current_user.surname 
    if form.validate_on_submit(): 
     current_user.surname = form.basic_information.surname.data 
     print(form.basic_information.surname.data) 
     current_user.save() 
     return redirect(url_for("frontend.index")) 
    return render_template("user_edit_profile.html", form=form) 

我沒有粘貼models.py,因爲它運行良好,我認爲沒有問題。

現在,print(form.basic_information.surname.data)反饋None,這意味着我無法從wtf格式的surname字段中輸入任何內容。

當我使用Charles來捕獲數據包時,我發現客戶端確實已將輸入內容(如「Smith」)發送到服務器。但顯然,服務器丟失了它。

我也試圖通過使用FlaskForm,而不是Form子窗體的同時我重寫csrf_enabled參數傳遞給False

def __init__(self, *args, **kwargs): 
    kwargs['csrf_enabled'] = False 
    FlaskForm.__init__(self, *args, **kwargs) 

但這並沒有幫助。

我不知道問題出在哪裏,謝謝你的幫助!

回答

0

這個問題的原因是爲了,在開始的時候,你的current_user.surnameNone,你這樣寫:

form.basic_information.surname.data = current_user.surname 

所以你form.basic_information.surname.dataNone,在同一時間,表單數據form.basic_information.surname.data是覆蓋。

正確的順序是這樣的:

+0

這確實解決了我的問題。我以前對'validate_on_submit'的理解是錯誤的。謝謝! – urbainy