Flask WTForms и независимая проверка в одной общей форме - PullRequest
0 голосов
/ 14 мая 2019

Я пишу страницу профиля и у меня возникли проблемы с подчиненными формами во Flask. Например - у меня есть одна страница с 2 кнопками отправки и полями, такими как - пароль и некоторые заметки.

views.py

@auth.route('/profile/<user>', methods=['GET','POST'])
@login_required
def profile(user):
    form=ProfileForm()
    if request.method('POST'):
        if form.profile_password.sub_pass.data and form.profile_password.validate(form):
            db_rw("update users set password=? where username=?",(generate_password_hash(form.profile_password.password1.data), user))
            flash('Password has been updated')
        elif form.profile_notes.sub_info.data and form.profile_avatar.validate(form):
            db_rw("update users set notes=? where username=?",(form.profile_notes.notes.data, user))
            flash('Notes has been updatedd')
    return render_template('auth/profile.html', user=user, form=form)

forms.py

class ProfilePasswordForm(FlaskForm):
    password1 = PasswordField('Password', validators=[DataRequired(),Length(min=3,max=20,message='The password should be at least 8 characters long')]) #!!!!
    password2 = PasswordField('Repeat Password', validators=[EqualTo('password1',message='The passwords are mismatched')])
    sub_pass = SubmitField('Change')

class ProfileNotesForm(FlaskForm):
    notes = TextAreaField('Notes', validators=[Length(min=0, max=150)])
    sub_info = SubmitField('Save')

class ProfileAvatarForm(FlaskForm):
    ava = FileField('Avatar')
    sub_pic = SubmitField('Upload')

class ProfileForm(FlaskForm):
    profile_password=FormField(ProfilePasswordForm)
    profile_notes=FormField(ProfileNotesForm)
    profile_avatar=FormField(ProfileAvatarForm)

profile.html

{% block content %}

  <h3>Hello {{ user }} <br>


    <form action="" method="post" enctype="multipart/form-data" novalidate>
    {{ form.hidden_tag() }}

  <div>
    Change password: <br>

    {{ form.profile_password.password1 }}<br>
         {% for error in form.profile_password.password1.errors  %}
            <span style="color: red;">[{{ error }}]</span>
         {% endfor %}           
    {{ form.profile_password.password2 }}<br>
         {% for error in form.profile_password.password2.errors  %}
        <span style="color: red;">[{{ error }}]</span>
         {% endfor %}
    {{ form.profile_password.sub_pass() }}</p>
  </div>

  <div> 
    Notes: <br>     
    {{ form.profile_notes.notes }}
    {{ form.profile_notes.sub_info }}
  </div>

    </form>
{% endblock %}

Так что проблема в том, что я хочу иметь отдельные валидаторы для каждой части этой большой формы.

Но этот код

if form.profile_password.sub_pass.data and form.profile_password.validate(form)

не возвращает True, работает только одна часть этого условия.

Если представлена ​​кнопка «Сохранить», то должны запускаться только валидаторы для Notes и наоборот для кнопки «Изменить».

Что я делаю не так?

jfyi:

Я знаю, что могу использовать множители для управления множественными формами, но мне интересны подчиненные формы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...