Заполнить WTForm вложенный FieldList с отношениями многие ко многим - PullRequest
0 голосов
/ 05 февраля 2020

У меня проблема с работой с FieldList внутри моей формы.

WTForms имеет два метода, которые работают с родительской формой (populate_obj для отправки и процесс извлечения данных в запросе get), но я не могу коснуться данных из вложенного FieldList.

У меня есть подозрение, что проблема может заключаться в моделях. Соотношение между таблицами много-много, используя таблицу ассоциаций.

модели

TracksCatalogTable = Table('tracks_catalog_table',
                           Base.metadata,
                           Column('tracks_id', Integer, ForeignKey('tracks.id')),
                           Column('catalog_id', Integer, ForeignKey('catalog.id'))
                           )

class Tracks(Base):
    __tablename__ = 'tracks'
    id = Column(Integer, primary_key=True)
    isrc = Column(String(30))
    track_name = Column(String(255))
    track_number = Column(Integer)

    artist_id = Column(Integer, ForeignKey('artist.id', ondelete='CASCADE'))
    catalog_tracks = relationship("Catalog",
                                  secondary=TracksCatalogTable,
                                  back_populates="tracks_catalog")


class Catalog(Base):

    __tablename__ = 'catalog'
    id = Column(Integer, primary_key=True)
    catalog_number = Column(String(255))
    catalog_name = Column(String(255))

    artist_id = Column(Integer, ForeignKey('artist.id'))
    contract_id = Column(Integer, ForeignKey('contract.id', ondelete='CASCADE'))
    tracks_catalog = relationship("Tracks",
                                  secondary=TracksCatalogTable,
                                  back_populates="catalog_tracks")

формы

class AddTrackForm(FlaskForm):

    isrc = StringField('ISRC')
    artist_id = SelectField('Track Artist', choices=artist_list, coerce=int)
    track_name = StringField('Track Name')
    track_number = IntegerField('Track Number')


class AddCatalogForm(FlaskForm):

    catalog_number = StringField('Catalog Number', validators=[DataRequired()])
    catalog_name = StringField('Album Name', validators=[DataRequired()])
    artist_id = SelectField('Artist Name', choices=artist_list)
    tracks = FieldList(FormField(AddTrackForm, default=lambda: Tracks()))

    submit = SubmitField('Submit')

представления

@works.route("/works/edit_catalog/<catalog_id>", methods=['GET', 'POST'])
def edit_catalog(catalog_id):

    catalog_obj = db_session.query(Catalog).get(catalog_id)

    form = AddCatalogForm()

    if request.method == 'POST':
        form.populate_obj(obj = catalog_obj)
        db_session.add(catalog_obj)
        db_session.commit()
        return redirect(url_for('works.catalog'))

    if request.method == 'GET':
        form.process(obj=catalog_obj)
...