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(“在请求上下文之外工作”)。