5

我正在使用 wtforms,我需要创建一个基于数据库中的信息生成表单定义的东西;动态表单创建。我对需要做的事情有所了解,而我才刚刚开始。我可以创建表单并将它们与 wtforms/flask 一起使用,但是从表单到表单略有不同的数据定义表单目前超出了我目前的技能水平。

有没有人这样做并且有一些意见可以提供?有点模糊的问题,还没有实际的代码。我还没有找到任何示例,但这并非不可能。

mass of variable data to be used in a form --> wtforms ---> form on webpage

编辑:

因此,“例如”我们可以使用调查。一项调查由几个 SQLAlcehmy 模型组成。调查是具有任意数量的相关问题模型的模型(问题属于调查,例如多项选择题会变得复杂)。为了简化,让我们使用简单的 json/dict 伪代码:

{survey:"Number One",
    questions:{
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:text, field:"Place your X here"}
     } 
 }

{survey:"Number Two",
    questions:{
        question:{type:text, field:"Answer the question"},
        question:{type:truefalse, field:"Is this true or false"},
        question:{type:text, field:"Place your email address here"}
     } 
 }

想象一下,而不是这个,数百个具有 5 种以上字段类型的不同长度。如何使用 WTForms 来管理表单,或者我什至需要使用 wtforms?我可以根据需要定义静态表单,但还不能动态定义。

顺便说一句,我在 rails 中使用 simpleform 做过类似的事情,但是当我在 Python atm 中工作时(在不同的事情上,我以调查的事情为例,但问题/字段/答案的事情抽象了一个我需要许多类型的输入)。

所以是的,我可能需要建造某种工厂,这样做会花费我一些时间,例如:

http://wtforms.simplecodes.com/docs/1.0.2/specific_problems.html

https://groups.google.com/forum/?fromgroups=#!topic/wtforms/cJl3aqzZieA

4

2 回答 2

4

只需在运行时将适当的字段添加到基本表单。这是您如何执行此操作的草图(尽管已大大简化):

class BaseSurveyForm(Form):
    # define your base fields here


def show_survey(survey_id):
    survey_information = get_survey_info(survey_id)

    class SurveyInstance(BaseSurveyForm):
        pass

    for question in survey_information:
        field = generate_field_for_question(question)
        setattr(SurveyInstanceForm, question.backend_name, field)

    form = SurveyInstanceForm(request.form)

    # Do whatever you need to with form here


def generate_field_for_question(question):
    if question.type == "truefalse":
        return BooleanField(question.text)
    elif question.type == "date":
        return DateField(question.text)
    else:
        return TextField(question.text)
于 2012-09-11T16:41:34.560 回答
0
class BaseForm(Form):
    @classmethod
    def append_field(cls, name, field):
        setattr(cls, name, field)
        return cls

from forms import TestForm
form = TestForm.append_field("do_you_want_fries_with_that",BooleanField('fries'))(obj=db_populate_object)

我对所有表单都使用扩展类BaseForm并在类上有一个方便的 append_field 函数。

返回附加字段的类,因为(表单字段的)实例不能附加字段。

于 2013-08-19T23:09:34.263 回答