python - 无法使用 wtforms、append_entry() 和 FieldList(FormField()) 更改动态添加的表单字段的标签

标签 python flask wtforms

我正在努力更改使用 .append_entry() 动态添加的 FieldList 子表单的标签。我可以成功地更改整个表单以及每个单独字段前面的标签,但我仍然在每个连续的字段实例上方得到一个项目符号和默认 label-0、label-1、label-2 等,并且我无法重命名或删除它。

我正在创建一个表格,收集不同地区存在的不同数量的社区和武装分子的特征。我有一个总体表单和四个子表单。例如,如果我有 2 个地区和 3 个社区,则表单的第一部分(称为“regionpercent”)会询问每个地区认同每个社区的人口百分比,如下所示:

区域1
社区 1 百分比:
社区 2 百分比:
社区 3 百分比:

区域2
社区 1 百分比:
社区 2 百分比:
社区 3 百分比:

所以我需要将regionpercent的子标签更改为['Region1 <br>]社区百分比 1:'、'社区百分比 2:'、'社区百分比 3:'、' <br>区域 2 <br>社区百分比 1:'、'社区百分比 2:'、'社区百分比 3:']。但现在,在六个字段中的每一个字段之前,我都有一个“regionpercent-0”、“regionpercent-1”等。

主窗体称为 ThirdForm()。

这是我的表单类:

class RegionForm2(FlaskForm):
    x = FloatField(validators=[InputRequired()])

    def __init__(self, labels=None, **kwargs):
        super().__init__(**kwargs)
        if labels is None:
            labels = ['percent of the population:']
        self.x.label = Label(self.x.id, labels[0])

class GrievancesForm(FlaskForm):
    box = BooleanField(validators=None)

    def __init__(self, labels=None, **kwargs):
        super().__init__(**kwargs)
        if labels is None:
            labels = ['Grievance?:']
        self.box.label = Label(self.box.id, labels[0])

class AffiliationsForm(FlaskForm):
    boxm = BooleanField(validators=None)

    def __init__(self, labels=None, **kwargs):
        super().__init__(**kwargs)
        if labels is None:
            labels = ['Affiliation?:']
        self.boxm.label = Label(self.boxm.id, labels[0])

class MilitantForm2(FlaskForm):
    reg = BooleanField(validators=None)

    def __init__(self, labels=None, **kwargs):
        super().__init__(**kwargs)
        if labels is None:
            labels = ['Active?:']
        self.reg.label = Label(self.reg.id, labels[0])

class ThirdForm(FlaskForm):
    regionpercent = FieldList(FormField(RegionForm2))
    grievances = FieldList(FormField(GrievancesForm))
    affiliations = FieldList(FormField(AffiliationsForm))
    milactive = FieldList(FormField(MilitantForm2))
    submit = SubmitField('Submit')

    def __init__(self, labels=None, **kwargs):
        super().__init__(**kwargs)
        if labels is None:
            labels = ['Percentage of Each Community Present in Each Region', 'Grievances Between Communities', 'Affiliation of Communities with Militants', 'Active Militants in Each Region']
        self['regionpercent'].label = Label(self['regionpercent'].id, labels[0])
        self['grievances'].label = Label(self['grievances'].id, labels[1])
        self['affiliations'].label = Label(self['affiliations'].id, labels[2])
        self['milactive'].label = Label(self['milactive'].id, labels[3])

这是我的routes.py:

@app.route('/page3', methods=['GET', 'POST'])
def page3():
    regionnames = session.get('regionnames', None)
    communitynames = session.get('communitynames', None)
    militantnames = session.get('militantnames', None)
    form = ThirdForm()
    if form.validate_on_submit():
        regiondata = form.regionpercent.data
        return redirect(url_for('next_page'))
    for i in range(len(regionnames)*len(communitynames)):
        form.regionpercent.append_entry()
    for i in range(len(communitynames)*(len(communitynames)-1)):
        form.grievances.append_entry()
    for i in range(len(communitynames)*len(militantnames)):
        form.affiliations.append_entry()
    for i in range(len(regionnames)*len(militantnames)):
        form.milactive.append_entry()
    print('regionpercent:', form.regionpercent)
    return render_template('page3.html', title='Third Page', form=form)

这是我的 HTML:

<h1> Model Parameters- Page 3</h1>
    <h3> More Properties</h3>
    <form action="" method="post" novalidate>
        {{ form.hidden_tag() }}
        <p>
            {{ form.regionpercent.label }}<br>
            {{ form.regionpercent(size=32) }}
        </p>
        <p>
            {{ form.grievances.label }}<br>
            {{ form.grievances(size=32) }}
        </p>
        <p>
            {{ form.affiliations.label }}<br>
            {{ form.affiliations(size=32) }}
        </p>
        <p>
            {{ form.milactive.label }}<br>
            {{ form.milactive(size=32) }}
        </p>
        <p>{{ form.submit() }}</p>
    </form>
{% endblock %}

尽管手动添加标签,我仍然看到 <label for="regionpercent-0">Regionpercent-0</label>如果我打印 form.regionpercent。

我在routes.py文件中导入了地区、社区和武装分子名称的列表,以便我可以将它们用作标签,但由于我陷入了这个问题,所以我还没有做到这一点。我很乐观地认为我可以处理创建标签列表,但还不确定如何将这些列表传递给类。

我最初尝试创建一个子子表单,首先我将迭代社区的数量,然后迭代武装分子的数量(例如),但我无法访问所有社区的数据以这种方式使用 form.affiliations.data 的字段。因此,我绝对有必要更改这些子字段标签,以便区分社区 1 及其子部分 Militant1、Militant2... 等。

如果可以完全删除默认子字段标签并在每个字段实例之间添加我自己的文本,那也可以。

最佳答案

我通过在 HTML 模板中使用 Javascript 根据隐藏在页面中的名称查找标签来解决此问题。然后我用我喜欢的标签名称替换它们。例如,当出现不需要的标签是regionpercent-0时,我使用了以下代码:

var label = document.querySelector('label[for="regionpercent-0"]') !==null;
if (label) {
    var label = document.querySelector('label[for="regionpercent-0"]');
    label.textContent = '{{ region_percent_list[0] }}';
}

其中region_percent_list[0]是我想要使用的实际标签的变量名称。

关于python - 无法使用 wtforms、append_entry() 和 FieldList(FormField()) 更改动态添加的表单字段的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57416726/

相关文章:

Mac OS 上的 Python ioctl 错误

python - Linux 和 python : Combining multiple wave files to one wave file

python - 从另一个python脚本调用python脚本并设置执行脚本的执行目录

javascript - 前端使用flask render_template制作highchart

python - 我需要在 waitress 提供的 Flask api 中使用多重处理,如何实现?

wtforms - FieldList 内动态调整的表单

backbone.js - 渲染字段时Wtforms转义包含自变量js模板的value参数

python - 调用 sess.run() 时 Tensorflow 挂起

python - 如何在 Windows 上为 `flask run` 设置环境变量?

带 SQLAlchemy 的 Flask WTForms : UnmappedInstanceError when storing a form in a database