首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能使用wtform、append_entry()和FieldList(FormField())更改动态添加的表单字段的标签

不能使用wtform、append_entry()和FieldList(FormField())更改动态添加的表单字段的标签
EN

Stack Overflow用户
提问于 2019-08-08 16:07:10
回答 2查看 731关注 0票数 2

我很难更改使用FieldList ()动态添加的.append_entry子表单的标签。我可以成功地更改整个表单的标签,以及直接在每个单独字段前面的标签,但是我仍然可以在每个连续的字段实例之上得到一个子弹和一个默认的标签--0,Lab-1,Lab-2等等,我不能将它重命名或删除它。

我正在创建一种形式,它汇集了存在于不同地区的不同数量的社区和好战分子的特征。我有一个整体表格和四个子表格。例如,如果我有2个区域和3个社区,我的表单的第一部分叫做region%,它要求的是每个地区人口中与每个社区相同的百分比,如下所示:

区域1

社区1%:

社区2百分比:

社区3%:

区域2

社区1%:

社区2百分比:

社区3%:

因此,我需要将Region%的子标签更改为“Region1<br>百分比社区1:”、“百分比社区2:”、“百分比社区3:”、“<br>区域2<br>%Community1:”、“百分比社区2:”、“百分比社区3:”。但是现在,在六个字段中的每个字段之前,我都有一个“区域百分比-0”,“区域百分比-1”等等。

主表单名为ThirdForm()。

以下是我的表格课程:

代码语言:javascript
复制
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:

代码语言:javascript
复制
@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:

代码语言:javascript
复制
<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文件中导入了区域、社区和好战分子名称的列表,以便我可以使用它们作为标签,但我还没有做到这一点,因为我在这个问题上停滞不前。我乐观地认为,我可以处理创建标签列表的问题,但还不确定如何将这些列表传递给类。

我最初试图创建一个子子表单,首先遍历社区的数量,然后迭代好战分子的数量(例如),但我无法以这种方式访问所有字段的数据。因此,我绝对有必要更改这些子字段标签,以便区分Community1及其分区Militant1、Militant2.等。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-09 19:18:05

通过在HTML模板中使用Javascript查找隐藏在页面中的标签,解决了这个问题。然后,我将它们替换为我喜欢的标签名称。例如,如果出现不必要的标签的区域百分比-0,我使用了以下代码:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2021-04-19 16:43:06

我理解你的挣扎。

列表中的每个项都使用Label类,它具有field_id和text属性。

然后,可以按以下方式编辑label字段中的文本:

代码语言:javascript
复制
for i in range(len(regionnames)*len(communitynames)):
    form.regionpercent.append_entry()
    form.regionpercent[i].label.text = 'Region {}'.format(i)  # include this line

显然还有其他的变化,但我认为这足以理解逻辑。

这对我有很大帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57416726

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档