Добавление полей динамически
Я думаю, что лучше всего было бы создать пустую форму, а затем добавить поля в для цикла, однако, если форма размещена назад, как я могу проверить форму, если я не» t определил ли он в классе?
Добавьте поля в класса формы с использованием setattr
перед формой конкретизируется:
def update_form(request):
table = query()
class MyForm(Form):
pass
for row in table:
setattr(MyForm, row.key, SomeField())
form = MyForm(request.form)
Однако, я думаю, что ваш вопрос является частью более серьезной проблемой, которую я попытался обратиться ниже ,
Отображение таблиц в формах
Ваш стол, кажется, карта очень хорошо к самой форме. Если вы хотите динамически создавать формы из своих таблиц, вы можете сами написать логику. Но когда диапазон полей и вариантов поддержки растет, это может быть много работы по поддержанию. Если вы используете SQLAlchemy, вы можете взглянуть на WTForms-Alchemy. От его введения:
Много раз при создании современных веб-приложений с SQLAlchemy вы будете иметь формы, отображающую близко к моделям. Например, у вас может быть модель статьи , и вы хотите создать форму, которая позволяет пользователям публиковать новую статью . В этом случае было бы трудоемким определять поле типов и основных валидаторов в вашей форме, поскольку вы уже установили поля в своей модели.
WTForms-Alchemy предоставляет вспомогательный класс, который позволяет создать класс формы из модели SQLAlchemy.
Хелпер класс ModelForm
и в стиле вашей таблице ниже приведен пример Python 2/3 с WTForms-алхимии. Сначала установите пакет wtforms-alchemy
, который также потянет SQLAlchemy и WTForms.
from __future__ import print_function
from __future__ import unicode_literals
import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from wtforms_alchemy import ModelForm
engine = create_engine('sqlite:///:memory:')
Base = declarative_base(engine)
Session = sessionmaker(bind=engine)
session = Session()
class MyClass(Base):
__tablename__ = 'mytable'
id = sa.Column(sa.BigInteger, autoincrement=True, primary_key=True)
title = sa.Column(sa.Unicode(5), nullable=False)
gender = sa.Column(sa.Enum('male', 'female', name='gender'))
text = sa.Column(sa.Text)
class MyForm(ModelForm):
class Meta:
model = MyClass
form = MyForm()
print('HTML\n====')
for field in form:
print(field)
выполнения кода напечатает:
HTML
====
<input id="title" name="title" required type="text" value="">
<select id="gender" name="gender"><option value="male">male</option><option value="female">female</option></select>
<textarea id="text" name="text"></textarea>
Как вы можете видеть, WTForms-Alchemy сделал кучу с MyForm
. Класс, по существу, это:
class MyForm(Form):
title = StringField(validators=[InputRequired(), Length(max=5)])
gender = SelectField(choices=[('male', 'male'), ('female', 'female')])
text = TextField()
документация WTForms-Alchemy кажется очень всеобъемлющим. Я не использовал его сам, но если бы у меня была аналогичная проблема, я бы определенно попробовал это.