【问题标题】:Generate a dynamic form using flask-wtf and sqlalchemy使用 flask-wtf 和 sqlalchemy 生成动态表单
【发布时间】:2014-04-07 19:55:19
【问题描述】:

我有一个 web 应用程序,它允许用户创建自己的字段,以便稍后在表单中呈现。

我有一个像这样的模型 Formfield:

class Formfield(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    form_id = db.Column(db.Integer, db.ForeignKey('formbooking.id'))
    label = db.Column(db.String(80))
    placeholder_text = db.Column(db.String(80))
    help_text = db.Column(db.String(500))
    box_checked = db.Column(db.Boolean, nullable = True, default = False)
    options = db.Column(db.String) # JSON goes here?
    answer = db.Column(db.String)
    required = db.Column(db.Boolean, nullable = False, default = False)
    order = db.Column(db.Integer)
    fieldtype = db.Column(db.Integer) 

我用来表示一个字段,不管是什么类型的(复选框、输入,将来还会有更多)。

如您所见,每个字段都有一个针对 form_id 的 FK。

我正在尝试为给定的 form_id 生成动态表单。 问题是我需要确定要为每个 Formfield 呈现的字段类型。 所以我还需要在某个时候处理字段类型。

我想一个解决方案是以某种方式将 form_id 传递给我的 Form 类中的一个函数。

我不知道该怎么做或在哪里寻找解决方案。

任何帮助将不胜感激!

【问题讨论】:

    标签: python sqlalchemy flask wtforms flask-wtforms


    【解决方案1】:

    我想我设法用这里https://groups.google.com/forum/#!topic/wtforms/cJl3aqzZieA的想法创建了动态表单

    您必须在视图函数中创建一个动态表单,获取您想要获取的表单字段,并迭代每个字段以构造此表单对象。我将字段类型用于简单文本而不是整数值。因为它在代码级别似乎很容易阅读。

    class FormView(MethodView):
        def get(self):
            class DynamicForm(wtforms.Form): pass
    
            dform = main.models.Form.objects.get(name="name2")
            name = dform.name
            for f in dform.fields:
                print f.label
                setattr(DynamicForm , f.label, self.getField(f))
    
            d = DynamicForm() # Dont forget to instantiate your new form before rendering
            for field in d:
                print field # you can see html output of fields
    
            return render_template("customform.html", form=d)
    
        def getField(self, field): 
            if field.fieldtype == "text": 
                return TextField(field.label)
            if field.fieldtype == "password":
                return PasswordField(field.label)
            # can extend if clauses at every new fieldtype
    

    对于一个简单的表单渲染 jinja 模板 'forms.html'

    {% macro render(form) -%}
    <fieldset>
    {% for field in form %}
    {% if field.type in ['CSRFTokenField', 'HiddenField'] %}
      {{ field() }}
    {% else %}
      <div class="form-group {% if field.errors %}error{% endif %}">
        {{ field.label }}
        <div class="input">
          {% if field.name == "body" %}
            {{ field(rows=10, cols=40) }}
          {% else %}
            {{ field() }}
          {% endif %}
          {% if field.errors or field.help_text %}
            <span class="help-inline">
            {% if field.errors %}
              {{ field.errors|join(' ') }}
            {% else %}
              {{ field.help_text }}
            {% endif %}
            </span>
          {% endif %}
        </div>
      </div>
    {% endif %}
    {% endfor %}
    </fieldset>
    {% endmacro %}
    

    而customform.html是这样的

    {% extends "base.html" %}
    {% import "forms.html" as forms %}
    
    {% block content %}
    {{ forms.render(form) }}
    {% endblock %}
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 2015-05-18
    • 2016-11-08
    • 2019-05-22
    相关资源
    最近更新 更多