Как добавить дополнительное поле для каждого выбора, выбранного в QuerySelectMultipleField - PullRequest
0 голосов
/ 18 февраля 2020

Я делаю проект, используя Flask, WTForms и SQLALchemy .

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

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

Мои модели. py

class Ingredient(db.Model):
    materia_id = db.Column(db.String(15), db.ForeignKey('materia.id'), primary_key=True)
    formula_id = db.Column(db.Integer, db.ForeignKey('formula.id'), primary_key=True)
    ratio = db.Column(db.Decimal, nullable=False)
    materia = db.relationship('Materia', back_populates='formulas', passive_deletes='all')
    formula = db.relationship('Formula', back_populates='materias', passive_deletes='all')

class Formula(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    reactive_id = db.Column(db.String(15), db.ForeignKey('reactive.id'))
    reactive = db.relationship('Reactive', back_populates='formula')
    materias = db.relationship('Ingredient', back_populates='formula')

    def __repr__(self):
        return f"Formula('{self.id}')"

class Materia(db.Model):
    id = db.Column(db.String(15), primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    brand = db.Column(db.String(30), nullable=False)
    measure = db.Column(db.Enum(Medida), nullable=False)
    amount = db.Column(db.Decimal, nullable=False, default=0)
    type = db.Column(db.String(20), nullable=False, default='Materia')
    formulas = db.relationship('Ingredient', back_populates='materia')

    def __repr__(self):
        return f"Materia Prima('{self.name}', '{self.brand}', '{self.measure}')"

def materia_query():
    return Materia.query.all()

My forms.py

class NewFormula(FlaskForm):
    materia = QuerySelectMultipleField('Choose Materias',query_factory=materia_query, get_label='id')
    submit = SubmitField('Enter')
...