[英]Can't Change Labels for Dynamically-Added Form Fields Using wtforms, append_entry() and FieldList(FormField())
我正在努力更改使用 .append_entry() 动态添加的 FieldList 子表单的标签。 我可以成功地更改整个表单的标签,并直接在每个单独的字段前面更改标签,但我仍然在每个连续的字段实例上方得到一个项目符号和一个默认标签 0、标签 1、标签 2 等,我无法重命名或摆脱它。
我正在创建一个表格,该表格收集了存在于不同地区的不同数量的社区和武装分子的特征。 我有一个整体表格和四个子表格。 例如,如果我有 2 个地区和 3 个社区,我的表单的第一部分称为 regionpercent 要求每个地区的人口中认同每个社区的百分比,看起来像这样:
区域 1
百分比社区 1:
百分比社区 2:
百分比社区 3:
区域 2
百分比社区 1:
百分比社区 2:
百分比社区 3:
所以我需要将 regionpercent 的子标签更改为 ['Region1 <br>
Percent Community 1:', 'Percent Community 2:', 'Percent Community 3:', ' <br>
Region 2 <br>
Percent Community 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 %}
尽管手动添加标签,如果我打印 form.regionpercent,我仍然会看到<label for="regionpercent-0">Regionpercent-0</label>
。
我在我的 routes.py 文件中导入了地区、社区和武装分子名称的列表,以便我可以将它们用作标签,但我还没有做到这一点,因为我被困在这个问题上。 我很乐观,我可以处理创建标签列表,但不确定如何将这些列表传递给类。
我最初试图创建一个子子表单,首先我会迭代社区的数量,然后迭代武装分子的数量(例如),但我无法使用表单访问所有字段中的数据.affiliations.data 这种方式。 因此,我绝对有必要更改这些子字段标签以区分 Community 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] 是我想使用的实际标签的变量名。
我理解你的挣扎。
列表中的每一项都使用 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
显然还有其他变化,但我认为这足以理解逻辑。
这对我帮助很大。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.