无法使用wtforms,append_entry()和FieldList(FormField())

时间:2019-08-08 16:07:10

标签: 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 { {1}}“社区1:百分比”,“社区2:百分比”,“社区3:百分比”]。但是现在,在六个字段中的每个字段之前,我都有一个“ regionpercent-0”,“ regionpercent-1”等。

主要形式称为ThirdForm()。

这是我的表单类:

<br>

这是我的路线。py:

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])

这是我的HTML:

@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)

尽管手动添加标签,但是如果我打印form.regionpercent,我仍然看到<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 %}

我在我的routes.py文件中导入了地区,社区和好战分子名称的列表,以便可以将它们用作标签,但是由于我在这个问题上遇到的困难,我还没有做到。我对我可以处理创建标签列表感到乐观,但不确定如何将这些列表传递给类。

最初,我试图创建一个子表单,首先我要遍历社区的数量,然后遍历好战分子的数量(例如),但是我无法从所有字段使用form.affiliations.data这样。因此,绝对有必要更改这些子字段标签,以区分社区1及其子部分Militant1,Militant2 ...等。

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

2 个答案:

答案 0 :(得分:0)

我通过在HTML模板中使用JavaScript来解决此问题,该标签基于隐藏在页面中的标签来查找标签。然后,我用我喜欢的标签名称替换了它们。例如,在出现不需要的标签的区域为percentpercent-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]是我要使用的实际标签的变量名。

答案 1 :(得分:0)

我理解你的挣扎。

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

然后您可以按如下方式编辑标签字段中的文本:

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

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

这对我帮助很大。