Как сопоставить столбец db.model с объектом в Flask? - PullRequest
0 голосов
/ 21 марта 2020

Как мне сопоставить объект flask -формы с flask -моделью, чтобы у каждого зарегистрированного пользователя был уникальный экземпляр формы?

По функциональности, вот что я хочу:

from app import db, login_manager
from flask_login import UserMixin

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField, SubmitField, IntegerField
from wtforms.validators import DataRequired, Length, Email, EqualTo, ValidationError

class MyForm(FlaskForm):
    name = StringField('Name:', validators=[DataRequired(), Length(min=2, max=20)])
    submit = SubmitField('Sign In')

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    myform = db.Column(db.Object, unique=True, nullable=False)

А когда я создаю экземпляр пользователя:

user = User(myform=MyForm())
db.session.add(user)
db.session.commit()

И когда мне нужно получить доступ / передать форму в маршрутах:

@app.route('/')
def index():
    user = User.query.get(1)
    form = user.myform
    return render_template(url_for('index.html'), form=form)

Я хочу, чтобы у каждого пользователя был свой уникальный экземпляр формы, потому что я хочу, чтобы форма динамически редактировалась зарегистрированным пользователем, чтобы каждый пользователь имел свою собственную форму и поля.

EDIT

Я нашел эту ссылку на странице SQLAlchemy https://docs.sqlalchemy.org/en/13/core/custom_types.html#creating -new-types Однако можно ли ее реализовать в flask -sqlalchemy?

Из sqlalchemy:

import sqlalchemy.types as types

class MyType(types.UserDefinedType):
    def __init__(self, precision = 8):
        self.precision = precision

    def get_col_spec(self, **kw):
        return "MYTYPE(%s)" % self.precision

    def bind_processor(self, dialect):
        def process(value):
            return value
        return process

    def result_processor(self, dialect, coltype):
        def process(value):
            return value
        return process

table = Table('foo', meta,
    Column('id', Integer, primary_key=True),
    Column('data', MyType(16))
    )
...