【问题标题】:Dynamic forms from variable length elements: wtforms来自可变长度元素的动态表单:wtforms
【发布时间】:2012-09-10 14:18:09
【问题描述】:

我正在使用 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?我可以根据需要定义静态表单,但还不能动态定义。

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

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

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

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

【问题讨论】:

  • 您可以查看 wtforms 附带的扩展。例如。 SQLAlchemy 扩展可以从模型bitbucket.org/simplecodes/wtforms/src/113994790508/wtforms/ext/… 生成一个表单你的问题有点含糊。你能举一个实际的例子吗?什么时候什么时候表格中的某些东西必须改变?
  • 它是一系列模型,其他模型属于它们....一个事物调查有任意数量的问题,每个问题都有任意数量的答案空间;即用户生成的调查格式的问题/答案表格。
  • 好的,我相信我在上面发布的链接中的 model_form 方法就是您要找的。它动态地从给定模型生成表单。另外,Flask-Admin 是一个很好的例子,你可以使用它来实际呈现表单github.com/mrjoes/flask-admin/blob/master/flask_admin/templates/…
  • 第一个链接有点沿着路径...我需要从类实例和属于该特定实例的类实例创建一个表单(例如,调查实例的表单具有 10 个 t/f 问题的类与具有 100 个文本字段输入问题的调查类实例的表单),这似乎不适合实例,除非我需要为每个调查类构建某种动态的子类,嗯跨度>
  • 如果您觉得这“目前超出了您的技能范围”,也许您可​​以提出一个问题,让您在您的技能范围内找到正确的方向?也许如何使用 wtform 创建和使用动态生成的表单(列表/字典中只有垃圾数据)?一旦您对此感到满意,您就可以将数据库用作数据源。

标签: python forms wtforms


【解决方案1】:

只需在运行时将适当的字段添加到基本表单。下面是一个草图你可能会如何做(虽然非常简化):

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)

【讨论】:

  • 这基本上就是我最终要做的。我有一个包含用于标识的字段的基本表单,然后在模型中,我正在构建方法,该方法将返回一个子类化基本表单的表单,并且......到目前为止它看起来是可行的,尽管我仍然有办法达到 100 % 操作,但我可以通过控制台让它工作和使用它。
  • @Sean Vieira 我遇到了同样的问题。我想预先填充创建的表单,以便用户可以更新它们。我试过 TextField(question.text,default='hi') 但它没有用。但是“默认”适用于静态“表单”。我必须在这里做点别的吗?
  • @Pankaj - 我需要比这更多的信息 - 听起来值得提出一个问题(使用重现问题的代码 sn-p)
  • @SeanVieira:我添加了一个问题。你能调查一下吗。 stackoverflow.com/questions/28165987/…
【解决方案2】:
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 函数。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 2018-10-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2013-08-13
    • 1970-01-01
    相关资源
    最近更新 更多