flask-wtforms 中一页上的两种形式相同 class

Two forms of same class on one page in flask-wtforms

在我的网站上,我有一个包含许多活动的模型实验。我有一个视图,人们可以在其中添加或删除实验中的活动。

我展示了一个 table 活动,它是这个实验的一部分,还有一个 table 活动不是这个实验的一部分。用户可以检查他们想要添加或删除哪些活动,并使用 table.

下的提交按钮

但是,当我更新一个表单上的选项列表时,另一个表单上的选项列表反映了这一点。我做错了什么吗?

对于添加和删除活动 to/from 实验,我使用相同的表格。

class MultiCheckboxField(SelectMultipleField):
    widget = ListWidget(prefix_label=False)
    option_widget = CheckboxInput()

class ActivityListForm(Form):
    activities = MultiCheckboxField(validators=[DataRequired()], choices=[])
    submit = SubmitField("Submit")

    def populate_activities(self, activities_set):
        activities_mapping = {}
        for activity in activities_set:
            activities_mapping[str(activity.id)] = activity
            choice_tuple = (str(activity.id), activity.question)
            self.activities.choices.append(choice_tuple)
        return activities_mapping

这是我的观点:

def settings_experiment(exp_id):
    experiment = Experiment.query.get(exp_id)

    remove_activities_form = ActivityListForm(prefix="remove")
    add_activities_form = ActivityListForm(prefix="add")

    remove_activities_mapping = remove_activities_form.populate_activities(
        experiment.activities)

    add_activities_mapping = add_activities_form.populate_activities(
        Activity.query.\
            filter(not_(Activity.experiments.any(id=experiment.id))).all())


    return render_template("experiments/settings_experiment.html",
                           experiment=experiment,
                           update_experiment_form=update_experiment_form,
                           remove_activities_form=remove_activities_form,
                           add_activities_form=add_activities_form,
                           add_activities_mapping=add_activities_mapping,
                           remove_activities_mapping=remove_activities_mapping)

虽然 remove_activities_formadd_activities_form 将它们的选项分别设置为不同的列表,但它们最终都包含了两个选项列表的并集,这打乱了我的模板渲染。有没有办法让它们分开,还是我搞砸了?

https://github.com/wtforms/wtforms/issues/284

上述讨论中的解决方案。