我想我设法从这里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 > {{ field.label }} <div > {% if field.name == "body" %} {{ field(rows=10, cols=40) }} {% else %} {{ field() }} {% endif %} {% if field.errors or field.help_text %} <span > {% 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 %}


