JRazor
@JRazor
Senior StarkOverFlow Programmer

Как передать данные формы на другую страницу?

Доброго дня, коллеги.

Хочу на сайте организовать двух-шаговую регистрацию. Смысл понятен всем - видя меньше количество полей пользователь охотнее регистрируется. Сейчас все организовал так, как опишу ниже, но я не могу передать данные формы со страницы регистрации 1 на страницу регистрации 2 для обработки формы.

views.py
@mod.route('/welcome/1', methods=['GET', 'POST'])
def register_step1():
    form = RegisterForm1(request.form)
    if request.method == 'POST':
        if form.validate():
            values = {'first_name': form.first_name.data,
                      'age': form.age.data,
                      'gender': form.gender.data,
                      'search_gender': form.search_gender.data}
            return redirect(url_for('.register_step2', values=values))
        else:
            return "No validate: {0}".format(dict(request.form))
    return render_template('register1.html', form=form)

@mod.route('/welcome/2', methods=['GET', 'POST'])
def register_step2(values):
    form = RegisterForm2(request.form)
    if request.method == 'POST':
        dic = {
            'values': values,
        }
        return Response(json_util.dumps(dic), mimetype='application/json')
    return render_template('register2.html', form=form)


register1.html (форма 1)
<form method="POST" action="/welcome/1" enctype="multipart/form-data">
    {{ form.csrf_token }}
<table>
{% for field in form %}
    <tr>
        <td>{{ field.label }}</td>
        <td>{{ field }}</td>
    </tr>
{% endfor %}
</table>
<input type=submit value="To Step 2">
</form>


register2.html (форма 2)
<form method="POST" action="/welcome/2" enctype="multipart/form-data">
    {{ form.csrf_token }}
<table>
{% for field in form %}
    <tr>
        <td>{{ field }}</td><td>{{ field.label }}</td>
    </tr>
{% endfor %}
</table>
<input type=submit value="Registration">
</form>
  • Вопрос задан
  • 3408 просмотров
Решения вопроса 1
JRazor
@JRazor Автор вопроса
Senior StarkOverFlow Programmer
Решил вопрос так: передал данные через session
Страница #1:
session['data'] = {'bla-bla-bla': 0}

Страница #2:
session.get('data', None)

На первостепенную истинность не претендую, но в решении моей задачи все отлично.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
gunlinux
@gunlinux
Freelancer
Можно например так
return redirect(url_for('.register_step2',
                                       first_name=form.first_name.data,
                                       age= form.gender.data,
                                       gender=form.gender.data,
                                       search_gender=form.search_gender.data
            ))

И потом разбирать аргументы через request.form.args

Еще можно прямо на этом этапе создать пользователя и в финальный экран регистрации передавать id незарегистрированного пользователя

Мне кстати не совсем понятно, что за интересный вызовы flask-wtf
@mod.route('/welcome/1', methods=['GET', 'POST'])
def register_step1():
    form = RegisterForm1()
    if form.validate_on_submit():
            '''
            Что-то делаем
            '''
            return redirect(url_for('.register_step2', values=values))
        '''
        else:
            return "No validate: {0}".format(dict(request.form))
         Эта часть не нужна так-как form-errors на строне шаблонов можно отрабатывать
        '''
    return render_template('register1.html', form=form)


Еще можно сделать все в одну форму и просто js'ом разбить форму на два экрана. Без магии.

Бонус:
<form method="POST" action="{{url_for('mod.register_step1')}}" enctype="multipart/form-data">
Ответ написан
Ваш ответ на вопрос

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

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