Динамические формы из элементов переменной длины: wtforms

Я использую 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, но так как я работаю в Python atm (над чем-то другим, я использую опрос в качестве примера, но вопрос / поле / ответ абстрагируется от много типов входов, которые мне нужны).

Так что да, возможно, мне понадобится построить какую-то фабрику, на это у меня уйдет некоторое время, например:

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

https://groups.google.com/forum/?fromgroups=

2 ответа

Решение

Просто добавьте соответствующие поля в базовую форму во время выполнения. Вот набросок того, как вы можете это сделать (хотя и очень упрощенно):

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)
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 для класса.

Возвращает класс с добавленным полем, так как экземпляры (полей формы) не могут добавлять поля.

Другие вопросы по тегам