不了解如何将从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,插值)]。
答案 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的菜单,其中显示了每个选项和文本字段,以插入其他数据。