Настойка редактировать несколько одновременно в выпуске многие-к-одному - PullRequest
0 голосов
/ 06 января 2019

Я хотел бы создать форму для одновременного редактирования нескольких объектов отношения многие-к-одному.

Модель проектирования объектов имеет много связанных столбцов объектов.

Содержимое этих столбцов объектов генерируется автоматически с помощью функции (для каждого столбца данного файла для проектирования объектов).

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

Но есть ли способ иметь динамический диапазон полей редактирования с одной отправкой для всех, а затем зацикливаться на rout.py?

Спасибо за любую подсказку.

class FeatureEngineering(db.Model): 
    id = db.Column(db.Integer, primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
    train_file = db.Column(db.String(100))
    test_file = db.Column(db.String(100))
    description = db.Column(db.Text) # RB turn to function Text()?
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    columns = db.relationship('FeatureColumn', backref='columns',lazy='dynamic')
    def __repr__(self):
        return '<Feature Engineering {}>'.format(self.name) 

class FeatureColumn(db.Model): 
    id = db.Column(db.Integer, primary_key=True)
    feature_engineering_id = db.Column(db.Integer, db.ForeignKey('feature_engineering.id'))
    sample = db.Column(db.String(500))
    use = db.Column(db.Boolean)
    val_type = db.Column(db.String(100))
    val_count = db.Column(db.Integer)
    val_unique_count = db.Column(db.Integer)
    val_min = db.Column(db.Float)
    val_max = db.Column(db.Float)
    val_mean = db.Column(db.Float)
    val_stddev = db.Column(db.Float)
    val_skew = db.Column(db.Float)
    val_kurtosis = db.Column(db.Float)
    guess = db.Column(db.String(140))
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    timestamp = db.Column(db.DateTime, index=True, default=datetime.utcnow)
    def __repr__(self):
        return '<Column {}>'.format(self.id) 

Редактировать

Привет, если кто-то ищет обходной путь, ниже реализации с несколькими кнопками отправки.

Сначала я создаю набор форм в rout.py и перебираю его в шаблоне. Чтобы узнать, какая форма была отправлена, я добавил динамическое скрытое поле и установил значение column_id, поэтому при перехвате POST можно определить, из какой формы пришла отправка.

forms.py:

class FeatureColumnForm(FlaskForm):
    column_id = HiddenField('column_id')
    action = StringField('Action', validators=[DataRequired()])
    submit = SubmitField('Update')

routes.py:

@app.route('/featureEngineering/<id>',methods=['GET','POST'])
@login_required
def featureEngineering(id): # feature engineering ID
    featureEngineering = FeatureEngineering.query.filter_by(id=id).first_or_404()
    form = {}
    for i in featureEngineering.columns:
        form[i.id] = FeatureColumnForm()
        if form[i.id].validate_on_submit():
            if (str(form[i.id].column_id.data) ==str(i.id)):
                feature_column = FeatureColumn.query.filter_by(id=i.id).first_or_404()
                feature_column.action = form[i.id].action.data
                db.session.commit()
                flash('updated')
                return redirect(url_for('featureEngineering',id=id))
        form[i.id].column_id.data = i.id
        form[i.id].action.data = FeatureColumn.query.filter_by(id=i.id).first_or_404().action
    featureEngineering = FeatureEngineering.query.filter_by(id=id).first_or_404()
    return render_template('featureEngineering.html',featureEngineering = featureEngineering,form=form)

соответствующий раздел шаблона:

{% for column in featureEngineering.columns %}
<tr>
    <td>{{  column.id }}</td>
    <td>{{  column.sample }}</td>
    <form action="" method="post">
        {{ form[column.id].hidden_tag() }}
        <td>{{  form[column.id].action(size=5) }} {{ form[column.id].submit() }}</td>
    </form>
    <td>{{  column.val_type }}</td>
    <td>{{  column.val_count }}</td>
</tr>
{% endfor %}

Но мне все еще интересно узнать, можно ли редактировать несколько с помощью одной отправки.

Спасибо Ральф

...