flask wtform field data disappearingappend_entry

时间:2015-04-14 22:18:12

标签: python flask wtforms

请帮忙 - 在append_entry调用之后,flask / wtforms以某种方式以不同的方式处理字段的data属性,或者我真的这样做了吗?

我有一个从yaml文件中获取数据的表单。在初始GET请求中,表单填充显示{% if ifc.poe.data %}中的图标按预期方式。如果按下任一按钮以添加模块或界面,POST将重新呈现页面,但现在ifc.poe.data为空,因此不会呈现图标。如果您注释掉if ifc.xxx.data部分并取消注释实际字段,则每次都会使用正确的数据呈现字段。这是关于我如何构建表单类或我如何处理POST的问题? ifc.xxx.data发生了什么?

感谢任何帮助,我对此非常陌生。

forms.py

from flask_wtf import Form      
from wtforms import Form as wtfForm # Bad hack to get around csrf in fieldlist  
class DevInterface(wtfForm):
    e_regex = '^ae(\d+)$'
    ifc = StringField("Interface", validators=[DataRequired()])
    poe = BooleanField('PoE', validators=[Optional()], default=False)
    uplink = BooleanField('Uplink', validators=[Optional()],default=False)
    desc = StringField("Description", validators=[Optional()],default='')
    voip = StringField("VOIP", validators=[Optional()], default='')
    etheropt = StringField("LAG interface", validators=[Optional(),Regexp(e_regex, message='Must designate an ae interface, eg. ae4')])
class DevHardware(wtfForm):
    module = SelectField('Module', choices=[
                  ('ex2200-24p','ex2200-24p'),('ex2200-48p','ex2200-48p'),
                  ('ex4200-10g','ex4200-10g'),('ex4200-24f','ex4200-24f')],
                  default='ex2200-48p')
fpc = SelectField('FPC', choices=[(str(i),str(i)) for i in range(10)], default=0)

class DevOptions():  
    id = StringField('Device Serial Number', validators=[DataRequired()])  
    hostname = StringField('Hostname', validators=[DataRequired()])  
    make = SelectField('Make', choices=[('juniper','Juniper')], default = 'juniper')  

class AddDev(Form, DevOptions):
    modules = FieldList(FormField(DevHardware), min_entries=1)
    interfaces = FieldList(FormField(DevInterface), min_entries=1)
    add_ifc = SubmitField()
    add_module = SubmitField()

views.py

@app.route('/editdev/<vspc>/<dev>', methods=['GET','POST'])
def editdev(vspc,dev):
    from skynet.forms import AddDev
try:
    d = s.loaddev(dev)
except IOError as e:
    flash(dev + ' does not exist.', category='danger')
    return redirect(url_for('editvspc', vspc=vspc))

# Have to change up how the data is presented for the form
d['id'] = dev
ifcs = d['interfaces']
del d['interfaces']
l = []
for i in ifcs:
    j={}
    j['ifc'] = i
    j.update(ifcs[i])
    l.append(j)
d['interfaces'] = sorted(l, key=lambda k: k['ifc'])

form = AddDev(request.form, data=d)

if form.add_ifc.data:
    form.interfaces.append_entry()
elif form.add_module.data:
    form.modules.append_entry()
elif request.method == 'POST' and form.validate():
    # Placeholder for now
    print 'Updated device'
for error in form.errors:
    for e in form[error].errors:
        flash(e, category='danger')
return render_template('adddev.html', form=form)

模板

{% extends "layout.html" %}  
{% import "bootstrap/utils.html" as util %}
{% block content %}
{{ super() }}
<div class="container-fluid">
  <h1 align='center'>Add Device</h1>
      <form method="post" action="">
        {{ form.hidden_tag() }}
        <div class="form-group">
          <table class="table">
            <tbody>
              <tr>
                <td>{{ form.id.label }}</td>
                <td>{{ form.id(size=20) }}</td>
              </tr>
              <tr>
                <td>{{ form.hostname.label }}</td>
                <td>{{ form.hostname(size=20) }}</td>
              </tr>
              <tr>
                <td>{{ form.make.label }}</td>
                <td>{{ form.make}}</td>
              </tr>
            </tbody>
          </table>
          {{ form.add_module }}
          <table class="table">
            <tbody>
              {% for field in form.modules.entries %}
              <tr>
                <td>{{ field.module.label }}</td>
                <td>{{ field.module }}</td>
                <td>{{ field.fpc.label }}</td>
                <td>{{ field.fpc }}</td>
              </tr>
              {% endfor %}
            </tbody>
          </table>
          <table class="table">
            <thead>
              <tr>
                <th>Interface</th>
                <th>Description</th>
                <th>PoE</th>
                <th>VoIP</th>
                <th>LAG</th>
                <th>Uplink</th>
              </tr>
            </thead>
          <tbody>
          {% for ifc in form.interfaces %}
            <tr>
              <td>{{ ifc.ifc(size=10) }}</td>
              <td>{{ ifc.desc }}</td>
              <td>
                {% if ifc.poe.data %}
                {{ util.icon('flash', style='color:red') }}
                {% endif %}
                {% if ifc.voip.data %}
                {{ util.icon('phone-alt', style='color:green') }}
                {% endif %}
                {% if ifc.etheropt.data %}
                <a class="label label-success">{{ ifc.etheropt.data }}</a>
                {% endif %}
                {% if ifc.uplink.data %}
                {{ util.icon('open', style='color:blue') }}
                {% endif %}
              </td>
           {# <td>{{ ifc.poe }}</td>
              <td>{{ ifc.voip }}</td>
              <td>{{ ifc.etheropt }}</td>
              <td>{{ ifc.uplink }}</td> #}
            </tr>
            {% endfor %}
          </tbody>
        </table>
          {{ form.add_ifc }}
      </div>
      <button type="submit" class="btn btn-default">Add Device</button>
    </form>
</div>

{% endblock %}

0 个答案:

没有答案