Я хотел бы создать форму для одновременного редактирования нескольких объектов отношения многие-к-одному.
Модель проектирования объектов имеет много связанных столбцов объектов.
Содержимое этих столбцов объектов генерируется автоматически с помощью функции (для каждого столбца данного файла для проектирования объектов).
Теперь я хочу, чтобы функция 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 %}
Но мне все еще интересно узнать, можно ли редактировать несколько с помощью одной отправки.
Спасибо
Ральф