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

Python 将数据作为选项从视图传递到表单,python,flask,wtforms,Python,Flask,Wtforms,不了解如何将从表单中获取的数据作为选项传递到表单字段。我真的很感激任何帮助 所以,这里是我正在做的:我使用页面上的复选框选择数据,然后我需要在同一页面上显示所选数据(它们的名称),每个页面附近都有额外的文本字段。稍后,必须填写所有文本字段,并且必须将“名称”和插入的数据发送到服务器 正如我所理解的,我需要使用表单用textfield呈现数据。我想可能是这个: forms.py import methods class MultiTextField(SelectMultipleField):

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

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

正如我所理解的,我需要使用表单用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)
class MultiTextField(SelectMultipleField):
    widget = widgets.TableWidget()
    option_widget = widgets.TextInput()

class SelectedForm(Form):
    name = MultiTextField()
views.py

from forms import ...

selected_data = {}

def return_selected():
    return selected_data
@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)
方法.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
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
变量
selected_data
存储通过其他表单选择的数据

如果运行此代码,则会出现错误
ImportError:无法导入名称返回\u selected
。可能是因为我在方法中导入视图,在表单中导入方法,在视图中导入表单

我看不出其他方法来满足我的需求,但它并没有像现在这样起作用

嗯,我发现了如何通过选择

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)
class MultiTextField(SelectMultipleField):
    widget = widgets.TableWidget()
    option_widget = widgets.TextInput()

class SelectedForm(Form):
    name = MultiTextField()
views.py

from forms import ...

selected_data = {}

def return_selected():
    return selected_data
@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)
可以在选择了
的视图中添加表单选项。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>
{% 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 %}

{{selected.name}

在choices中,我们可以这样说:[(1,“Apple”),(2,“Apple”)]但html显示标签“Apple”,并在其附近的文本字段中插入数字1,然后在文本字段中再次显示标签“Apple”,并插入数字2


当我提交表单时,它会在文本字段中发送插入的数据,即['1','2']。但不知何故,我需要获得:[(苹果,1,在文本字段中插入值),(苹果,2,插入值)]。

您有一个循环依赖项。查看导入表单,导入方法,导入表单


但你提出的解决方案非常危险。您在模块级存储数据,这绝对不是线程安全的,并且会导致用户之间的信息泄漏。不要这样做。将数据存储在中,以每个用户为单位。

感谢Daniel提供有关
会话的建议。我现在将所选数据存储在会话中

以下是我如何解决我的任务。我决定不使用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'))
home.html

<form name="selected" action="{{url_for('selected_work', url='result') }}" method="post">
    <p> {{selected.name}}</p>
<input type="submit" value="Calculate">
</form>
{% 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 %}
{%if selected%}
{键为%s,所选.iteritems()中的值为%}
{{value[0]}{{value[1]}}
{%endfor%} {%endif%}

这样我就得到了我需要的东西。在一个页面上,我看到了带有复选框和div的菜单,在每个复选框和div附近显示选项和文本字段,以插入额外的数据

我考虑过治疗,但没用。我在同一页上有10种不同的表格。每个表单都是一个复选框列表。用户可以选择任何。所有选择的值必须存储在某个位置。为此,我使用dict类型的全局变量。我不知道如何使用会话。我不明白表单的数量与此有什么关系。如果您从表单中获取了数据,则将其放入
request.session
内部,而不是全局dict。您不能使用全局dict。如果我这样做,在函数中使用它时,我会得到:RuntimeError(“在请求上下文之外工作”)。