2017-02-02 2 views
0

EDITED. Мой первоначальный вопрос был недостаточно ясен. Я хочу разрешить пользователю передавать значения в TextField в wtforms, после чего введенное значение появляется после их добавления. Это позволит пользователю передать несколько значений до того, как вы нажмете конечную кнопку «Sumbit» для всех значений, которые были первоначально введены.Передача данных из текстового поля в wtform & display в браузере

Я нашел this question за то, что что-то сделал с введенным текстом, и это то, что я пробовал. Код

Мой Python:

from flask import Flask, request, render_template, redirect 
from wtforms import TextField, Form, SubmitField 


def redirect_url(default='index'): 
    return request.args.get('next') or \ 
      request.referrer or \ 
      url_for(default) 


class RegionForm(Form): 
    field = TextField('Region') 
    Submit = SubmitField('AddRegion') 
    fieldList = [] 


def main(): 
    app = Flask(__name__) 

    @app.route('/region/', methods=['GET']) 
    def region(): 
     form = RegionForm(request.form) 

     return render_template("region.html", 
           form=form) 


    @app.route('/add/', methods=['POST']) 
    def add(): 
     request.form['fieldList'].append(request.form['field']) 
     return redirect(redirect_url()) 

    app.run(debug=True) 

Мой HTML код:

<form action="/add/" method="Post"> 
{% for field in form %} 
    <tr> 
     <th>{{ field.label }}</th> 
     <td>{{ field }}</td> 
    </tr> 
{% endfor %} 
</form> 
{% for item in form.fieldList %} 
    {{ item }} 
{% endfor %} 

Но после того, как я ввожу текст и нажмите кнопку "AddRegion", я получаю следующее сообщение об ошибке: The browser (or proxy) sent a request that this server could not understand. Однако, если Я прокомментирую строку request.form['fieldList'].append(request.form['field']), затем происходит перенаправление, но текст не был добавлен в скрытый список формы. Как мне и добавить текст в список и redirect назад на исходную страницу, так что пользователь может добавить еще текст? Похоже, что должна быть ошибка только с этой строкой, потому что все работает отлично.

Как я могу позволить пользователю динамически добавлять текст в поле, а затем показывать это поле в браузере? Затем, после того как были добавлены полные области областей, я хочу, чтобы потом получить этот список для последующей обработки в отдельной функции.

ответ

0

Часть первая

Таким образом, после глядя на ваш код, я думаю, что я нашел вашу проблему. Фланец очень специфичен в своих маршрутах.

Маршрут приложение, которое у вас есть в вашей колбе:

@app.route('/add', methods=['POST']) 

Однако текущая действие на форме, которая является: <form action="/add/" method="Post">

В колбу /add и /add/ фактически две разные web- маршруты. Поэтому @app.route не запускается. Если вы измените свой код на:

`<form action="/add" method="post">` 

Вы должны быть добры, чтобы идти отсюда.

Часть вторая

Я думаю, что может иметь дополнительный вопрос. Поэтому в своем HTML прямо сейчас вы фактически закрываете свой тег </form> перед тем, как перебирать свои объекты в fieldList.

</form> {% for item in form.fieldList %} {{ item }} {% endfor %}

Try:

{% for item in form.fieldList %} {{ item }} {% endfor %} </form>

Что я считаю, происходит то, что ваши входные данные формы являются на самом деле не помещаются внутри формы так, когда вы пытаетесь их, вы получаете доступ a KeyError.

+0

Хорошая добыча, но я все равно получаю ту же ошибку. Если я прокомментирую строку с 'request.form ['fieldList'] ...', тогда она работает нормально, но не добавляет вход в скрытый список в форме, как я этого хочу. – unasalusvictis

0

Я второй, что сказал Коди Майерс. Однако есть простой способ гарантировать правильные маршруты , даже если вы позже измените их: в вашей форме используйте action="{{ url_for('region') }}", а Flask автоматически заменит правильный маршрут для данного имени функции.

Смежные вопросы