将数据从视图传递到表单作为选择

时间:2014-05-12 14:31:25

标签: python flask wtforms

不了解如何将从form.data获取的数据作为choices传递到表单字段。我真的很感激任何帮助。

所以,这就是我正在做的事情:我在页面上使用复选框选择数据,然后我需要在同一页面上显示所选数据(它们的名称),每个附近都有附加的文本字段。之后,所有文本字段都必须填写并且名称为'并且必须将插入的数据发送到服务器。

据我了解,我需要使用表单使用textfield呈现数据。我想这可能就是这个:

forms.py

import methods

class MultiTextField(SelectMultipleField):
    widget = widgets.TableWidget()
    option_widget = widgets.TextInput()

class SelectedForm(Form):
    choices = methods.selected()
    value = MultiTextField('value',choices = choices)

views.py

from forms import ...

selected_data = {}

def return_selected():
    return selected_data

methods.py

from views import return_selected

def selected():
    data = return_selected()
    choices = []
    for key, value in data.iteritems():
        for item in value:
            choices.append((item, key))
    return choices

变量selected_data存储通过其他形式选择的数据。

如果我运行此代码,则会收到错误ImportError: cannot import name return_selected。可能是因为我在视图o.O

中导入方法,表单和表单中的方法中的视图

我看不出如何制作我需要的东西,但它不能正常工作。

好吧,我找到了如何通过选择。

forms.py

class MultiTextField(SelectMultipleField):
    widget = widgets.TableWidget()
    option_widget = widgets.TextInput()

class SelectedForm(Form):
    name = MultiTextField()

views.py

@app.route('/home', methods=['GET', 'POST'])
def show_work():
    selected = SelectedForm(request.form)
    choices = []
    for key, value in selected_data.iteritems():
        choices.append((key, value))
    selected.name.choices = choices
    return render_template('home.html', selected=selected)

可以使用selected.name.choices = choices在视图中添加表单选项。

但是这种形式以奇怪的方式放置数据:

home.html的

<form name="selected" action="{{url_for('selected_work', url='result') }}" method="post">
    <p> {{selected.name}}</p>
<input type="submit" value="Calculate">
</form>
在选择中,我们可以说:[(1,&#34; Apple&#34;),(2,&#34; Apple&#34;)]但是html显示标签&#39; Apple&#39;并且在文本字段附近插入数字1并再次标记&#39; Apple&#39;在文本字段中插入数字2。

当我提交表格时,它会在文本字段中发送插入的数据,即[&#39; 1&#39;,&#39; 2&#39;]。但不知怎的,我需要获得:[(Apple,1和在文本字段中插入的值),(Apple,2,插值)]。

2 个答案:

答案 0 :(得分:0)

你有一个循环依赖。查看导入表单,导入表单的导入表单。

但是你建议的解决方案非常危险。您正在模块级别存储数据,这绝对不是线程安全的,并且会导致用户之间的信息泄露。不要这样做。将数据存储在session,即每用户。

答案 1 :(得分:0)

感谢Daniel对session的建议。我现在在会话中存储所选数据。

以下是我解决任务的方法。我决定不使用wtforms表单来渲染用复选框选择的数据。我在会议中保留所有选择

views.py

import methods
from forms import ...

def make_record(works):
if session['data']:
    if not works:
        pass
    else:
        for work in works:
            session['data'].append(work)
else:
    session['data'] = [works]

@app.route('/home', methods=['GET', 'POST'])
def show_work():
    demount = DemountForm(request.form)
    tile = TileForm(request.form)
    chosen = []
    for each in session['data']:
        chosen.append(each)
    selected = methods.get_selected(chosen)
    return render_template('home.html', demount=demount, tile=tile, selected = selected)

@app.route('/home/<path:url>', methods=['GET', 'POST'])
def select_work(url):
    db = url
    if db:
        form = DemountForm(request.form)
        work = form.name.data
        make_record(work)
    return redirect(url_for('show_work'))

methods.py

def get_selected(ids):
    selected = {}
    for each in ids:
        data = db_session.query(Work.name, Work.dimension).filter(Work.id==each).all()
        data = data[0]
        selected[each] = data
    return selected

home.html的

{% if selected %}
    <div id="chosen">
        <form action="/home">
            {% for key, value in selected.iteritems() %}
                    {{value[0]}}<input type="text" id="{{key}}">{{value[1]}}<br>
            {% endfor %}
            <input type="submit" value="Submit">
        </form>
    </div>
{% endif %}

通过这种方式,我得到了我需要的东西。在一个页面上,我得到了带有复选框和div的菜单,其中显示了每个选项和文本字段,以插入其他数据。