【问题标题】:Simple dynamic forms with Flask/Flask-WTF使用 Flask/Flask-WTF 的简单动态表单
【发布时间】:2016-01-20 06:48:53
【问题描述】:

我需要构建一个带有多个复选框的简单表单。问题是我需要复选框来自一个看起来像这样的 csv 文件:

data_so.csv

Name
A. Blabla
U. Blublu
I. Blibli
O. Bloblo

现在,带有一些硬编码复选框的表单如下所示:

我需要“A. Blabla”而不是“Ms. 2”,而不是“Mr. 1”,我想要“U. Blublu”等,而不是 3 个复选框,我'd 需要 4,我的 csv 文件中的条目数。

这是我的 Flask 文件:

route_so.py

from flask import Flask, render_template, request, flash
from forms_so import ContactForm
import csv

app = Flask(__name__)

app.secret_key = 'development key'

@app.route('/', methods=['GET', 'POST'])
def home():
  form = ContactForm()

  if request.method == 'POST':
    if form.validate() == False:
      flash('All fields are required.')
      return render_template('home_so.html', form=form)
    else:
      print(form.node_1.data,form.node_2.data,form.node_3.data)
      return render_template('home_so.html', success=True)

  elif request.method == 'GET':
    return render_template('home_so.html', form=form)

if __name__ == '__main__':
  app.run(debug=True)

form_so.py

from flask.ext.wtf import Form
import csv
from wtforms import TextField, RadioField, TextAreaField, SubmitField, validators, BooleanField

class ContactForm(Form):

    # my attempt to force the creation of dynamic global variables
    with open('/data_so.csv', 'rb') as f:
        reader = csv.reader(f)
        r = list(reader)

    nodes = {}
    for i in range(1,len(r)):
        globals()[''.join("node_"+str(i))] = BooleanField(r[i][0])
    # end of my attempt to force the creation of dynamic global variables

    node_1 = BooleanField("Mr. 1")
    node_2 = BooleanField("Ms. 2")  
    node_3 = BooleanField("Dr. 3")
    # this needs to be dynamically set instead

    submit = SubmitField("Send")

所以我尝试并创建了动态变量(以一种肮脏、骇人的方式)。现在的问题是我不知道如何让 home_so.html 使用数量不定的变量...

home_so.html

{% extends "layout_so.html" %}

{% block content %}

  {% if success %}
    <p>Thank you for filling up our survey. We'll get back to you shortly.</p>

  {% else %}  

    <form action="{{ url_for('home') }}" method=post>
      {{ form.hidden_tag() }}

       <h2>List of check boxes dynamically built from local csv file</h2>

      #this needs to be dynamically set
      {{ form.node_1.label }}
      {{ form.node_1 }}

      {{ form.node_2.label }}
      {{ form.node_2 }}

      {{ form.node_3.label }}
      {{ form.node_3 }}

      {{ form.submit }}
    </form>

  {% endif %}
{% endblock %}

有没有办法用一个简单的 csv 文件来完成这类事情?如果没有,在加载客户端时动态生成表单的常用方法是什么?

【问题讨论】:

    标签: python html flask flask-wtforms


    【解决方案1】:
    {% for node in node_list_from_app %}
      <p class="field"><label><input type="checkbox" name="node" value="{{ node }}"> {{ node }}</label></p>
    {% endfor %}
    

    【讨论】:

    • 谢谢!我还需要更改 form_so.py 中的 Python 代码,不是吗?
    • 当然可以,但我是新手,只使用普通 Flask 进行试验,没有 WTForms,所以我不确定你应该如何更改应用程序中的代码。
    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2015-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-24
    相关资源
    最近更新 更多