Ответ
Для автоматической генерации и валидации форм на основе моделей SQLAlchemy используется библиотека WTForms в связке с расширением WTForms-Alchemy.
Этот подход, аналогичный ModelForm в Django, позволяет:
- Уменьшить количество шаблонного кода.
- Автоматически создавать поля формы, соответствующие полям модели.
- Использовать валидаторы, определенные в модели (например,
nullable=False).
Пример реализации
-
Определение модели SQLAlchemy:
# models.py from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50), nullable=False) email = Column(String(120), unique=True, nullable=False) -
Создание формы с помощью
ModelForm:# forms.py from wtforms_alchemy import ModelForm from models import User class UserForm(ModelForm): class Meta: model = User -
Рендеринг в шаблоне (например, Jinja2):
<form method="post"> {{ form.csrf_token }} <!-- Для защиты от CSRF, если настроено --> <div class="form-group"> {{ form.name.label }} {{ form.name(class_='form-control') }} </div> <div class="form-group"> {{ form.email.label }} {{ form.email(class_='form-control') }} </div> <button type="submit" class="btn btn-primary">Сохранить</button> </form>
Таким образом, WTForms-Alchemy берет на себя всю рутинную работу по созданию полей и их базовой валидации, оставляя разработчику только логику обработки данных.
Ответ 18+ 🔞
Слушай, а ведь в питоне есть такая же приблуда, как в Джанге, чтобы не пиздеть руками кучу однотипных форм! Библиотека WTForms в паре с WTForms-Alchemy — это просто ёперный театр, ей-богу.
Они делают ровно то, что нужно: берут твою SQLAlchemy-модель и на её основе автоматом генерируют форму. Никакого ручного объявления полей, валидация на минималках уже встроена — красота, блядь!
Как это выглядит на практике
-
Вот твоя модель, обычная такая, ни хуя себе:
# models.py from sqlalchemy import create_engine, Column, Integer, String from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String(50), nullable=False) email = Column(String(120), unique=True, nullable=False) -
А теперь магия, блядь! Создаём форму в два счёта:
# forms.py from wtforms_alchemy import ModelForm from models import User class UserForm(ModelForm): class Meta: model = UserВсё, сука! Поля
nameиemailсами подтянулись, валидация наnullable=Falseуже на месте. Не нужно каждый раз писатьStringField,EmailFieldи прочую хуйню. -
В шаблоне рендерим эту красоту (допустим, Jinja2):
<form method="post"> {{ form.csrf_token }} <!-- Защита от CSRF, если подключил --> <div class="form-group"> {{ form.name.label }} {{ form.name(class_='form-control') }} </div> <div class="form-group"> {{ form.email.label }} {{ form.email(class_='form-control') }} </div> <button type="submit" class="btn btn-primary">Сохранить</button> </form>
И вот так, ебать мои старые костыли, ты избавляешь себя от тонны рутинного кода. WTForms-Alchemy делает всю грязную работу, а тебе остаётся только бизнес-логику допилить. Удобно же, ёпта!