2017-02-19 4 views
0

user_edit_profile.html:Невозможно получить данные от WTForms на 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, что означает, что я ничего не могу получить от ввода в поле surname в форме wtf.

Когда я использую Чарльза для захвата пакета, я обнаружил, что клиент действительно отправил на сервер входную информацию, такую ​​как «Смит». Но, очевидно, сервер потерял его.

Я также попытался использовать FlaskForm вместо Form в подчиненном в то же время я отменяю csrf_enabled арг к False с помощью:

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

Но это не помогло.

Я не знаю, где проблема, спасибо за помощь!

ответ

0

Причиной этой проблемы было порядка, в самом начале, ваш current_user.surname является None, вы пишете это:

form.basic_information.surname.data = current_user.surname 

Так ваш form.basic_information.surname.data является None, в то же время, данные формы form.basic_information.surname.data был покрыты.

Правильный порядок таков:

+0

Это действительно решить мою проблему. Мое предыдущее понимание 'validate_on_submit' неверно. Благодаря! – urbainy