Как в Python реализовать генерацию HTML-форм на основе моделей SQLAlchemy, подобно Django Forms

Ответ

Для автоматической генерации и валидации форм на основе моделей SQLAlchemy используется библиотека WTForms в связке с расширением WTForms-Alchemy.

Этот подход, аналогичный ModelForm в Django, позволяет:

  • Уменьшить количество шаблонного кода.
  • Автоматически создавать поля формы, соответствующие полям модели.
  • Использовать валидаторы, определенные в модели (например, nullable=False).

Пример реализации

  1. Определение модели 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)
  2. Создание формы с помощью ModelForm:

    # forms.py
    from wtforms_alchemy import ModelForm
    from models import User
    
    class UserForm(ModelForm):
        class Meta:
            model = User
  3. Рендеринг в шаблоне (например, 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-модель и на её основе автоматом генерируют форму. Никакого ручного объявления полей, валидация на минималках уже встроена — красота, блядь!

Как это выглядит на практике

  1. Вот твоя модель, обычная такая, ни хуя себе:

    # 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)
  2. А теперь магия, блядь! Создаём форму в два счёта:

    # forms.py
    from wtforms_alchemy import ModelForm
    from models import User
    
    class UserForm(ModelForm):
        class Meta:
            model = User

    Всё, сука! Поля name и email сами подтянулись, валидация на nullable=False уже на месте. Не нужно каждый раз писать StringField, EmailField и прочую хуйню.

  3. В шаблоне рендерим эту красоту (допустим, 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 делает всю грязную работу, а тебе остаётся только бизнес-логику допилить. Удобно же, ёпта!