Динамические формы из элементов переменной длины: 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
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 для класса.
Возвращает класс с добавленным полем, так как экземпляры (полей формы) не могут добавлять поля.