使用flask-wtf和sqlalchemy生成动态表单

我有一个Webapp,允许用户创建自己的字段,以供以后使用表单呈现。

我有一个像这样的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类中的一个函数。

我不知道如何操作或在哪里寻找解决方案。

回答:

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

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 %}

以上是 使用flask-wtf和sqlalchemy生成动态表单 的全部内容, 来源链接: utcz.com/qa/429052.html

回到顶部