@yavaskript

Как лучше обыграть валидацию форм, если на странице 2 формы?

Существует страница с двумя формами - входа и регистрации. Формы находятся на разных сторонах переворачиваемой карточки. (подробнее: на одной стороне карточки - которая прорисовывается при загрузке страницы - форма входа. А на другой стороне карточки - форма регистрации. Если не зарегистрирован, нажимаешь кнопку "зарегистрироваться", и карточка переворачивается)
Так вот, я использую wtforms и встроенные валидаторы. Но проблема в том, что, если вместо e-mail ввести абракадабру, то форма не проходит валидацию. И страница перезагружается, добавляя примечания к input'ам, которые содержат неправильные данные. В моем случае получается не очень удобно для пользователя. А именно. Пользователь неправильно заполнил форму регистрации (которая на другой стороне карточки) -> страница перезагружается -> пользователю показывается сторона карточки с формой входа. А хотелось бы, чтобы карточка была обращена к пользователю той стороной, которую он заполнял.
Но я не могу придумать, как это сделать. Как запомнить положение карточки до перезагрузки страницы? Или может быть, как-то запустить скрипт, который переворачивает карточку автоматически при перезагрузке, если сабмит исходит от формы регистрации? Но как это сделать? Если нужен код - приложу
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
@iddqda
network engineer, netdevops
во первых валидацию можно написать на js
document.getElementById("myForm").addEventListener('submit', (event) => {        
        const data = new FormData(event.target);
        if(!formValid(data)) {
              event.preventDefault();  // отменяем action формы
              return;
        }
})


а во вторых можно не перегружать страницу
точно так же сделать свой обработчик на submit
в нем fetch post (ajax умер давно)
document.getElementById("myForm").addEventListener('submit', (event) => {             
        const data = new FormData(event.target);
        fetch("/register", {
            method: 'POST',                                            
            body: data
        })
        .then((response) => response.json())
        .then((data) => {
            // тут рисуешь алерты в DOM
        })
        .catch((error) => {            
            console.log(`fetch.post response came up with an error: ${error}`);
        });
        event.preventDefault();
    })

а со стороны фляги
if request.method == 'POST':               
   data = request.form
   ok, err = validateForm(data)
   if not ok:
       return jsonify(err)
   DoRegisterUser(data)
   return redirect(url_for(index))


в третьих если все же хочется оставить валидаторы wtf то просто надо сохранить состояние карточки
для этого при переворачивании карточки добавить/убрать бит в cookie
а при перезагрузке страницы прочитать этот бит и повернуть карточку нужной стороной
https://www.w3schools.com/js/js_cookies.asp

з.ы. может все совсем не так. я не настоящий сварщик (с)
Ответ написан
Комментировать
@Che603000
c 2011 javascript
Как запомнить положение карточки до перезагрузки страницы?

Cамое простое решение - использовать sessionStorage. Запишите состояние страницы. (какая сторона карточки активна). Тогда Вы можете получить это состояние после перезагрузки и показать нужную сторону.

const stateCard = localStorage.getItem('card');  // получить активную сторону карты
if(stateCard === 'register'){
 // сделать активной регистрацию
} else {
 // сделать активным вход
}
...
function onSubmit(){
   localStorage.setItem('card', 'register'); // установить активную сторону карты
   ....
}


док sessionStorage
https://developer.mozilla.org/ru/docs/Web/API/Wind...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы