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

«Как в Python реализовать генерацию HTML-форм на основе моделей SQLAlchemy, подобно Django Forms» — вопрос из категории Django, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для автоматической генерации и валидации форм на основе моделей 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 берет на себя всю рутинную работу по созданию полей и их базовой валидации, оставляя разработчику только логику обработки данных.