我使用 Flask-WTForms 在 Flask 中制作了一个简单的表单,家长可以在其中注册自己和他的 child 。家长可以通过单击“添加 child ”按钮来注册任意数量的 child 。 WTForms 通过使用 FieldList 功能使这变得非常容易实现。
但是,单击“添加子项”按钮后,页面会自行刷新,因为它向服务器发出请求。我想使用 AJAX 请求添加子表单,这样页面就不会自行刷新。
我知道如何执行 AJAX 请求、发回响应并将此响应添加到 html 页面。但是,我不知道如何将条目附加到表单对象并使用更新的表单对象返回页面本身(以某种方式)。这可能吗?
我的表格:
class ChildForm(FlaskForm):
name = StringField(label='Name child')
age = IntegerField(label='Age child')
class Meta:
# No need for csrf token in this child form
csrf = False
class ParentForm(FlaskForm):
name = StringField(label='Name parent')
children = FieldList(FormField(ChildForm), label='Children')
add_child = SubmitField(label='Add child')
submit = SubmitField()
我的路线:
@app.route('/register', methods=['GET', 'POST'])
def register():
form = ParentForm()
if form.add_child.data:
form.children.append_entry()
return render_template('register.html', form=form)
if form.validate_on_submit():
# do something with data
return render_template('register.html', form=form)
注册.html:
<form action="{{ url_for('register') }}" method="post" id="parentForm">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name }}
{{ form.add_child }}
{% for childform in form.children %}
{% for field in childform %}
{{ field.label }} {{ field }}
{% endfor %}
{% endfor %}
{{ form.submit }}
</form>
最佳答案
我认为这应该有效。禁止任何错别字。
View .py
########
# SET UP YOUR FLASK APP HERE
########
from flask_wtf import FlaskForm
from wtforms_alchemy import model_form_factory
class Family(db.Model):
id = db.Column('id', db.Integer, primary_key=True)
name = db.Column(db.String(500), info={'label': 'Familyname', 'validators': DataRequired()})
class Member(db.Model):
id = db.Column('id', db.Integer, primary_key=True)
name = db.Column(db.String(500), info={'label': 'Member', 'validators': DataRequired()})
BaseModelForm = model_form_factory(FlaskForm)
class ModelForm(BaseModelForm):
@classmethod
def get_session(self):
return db.session
class MemberForm(ModelForm):
class Meta:
model = Machine
class MemberEditForm(MemberForm):
pass
class MainForm(ModelForm):
add_member = SubmitField('+ Member')
members = ModelFieldList(FormField(MemberForm))
class Meta:
model = Family
@app.route('/form')
def main_form():
family = Family()
form = MainForm(obj=family)
if form.add_member.data:
getattr(form,'members').append_entry()
return render_template('form.html', form=form)
if form.validate_on_submit():
form.populate_obj(family)
db.session.add(order)
db.session.commit()
return render_template('form.html', form=form)
@app.route('/process_add_member', methods=['POST'])
def add_member():
form = MainForm()
getattr(form,'members').append_entry()
return render_template('members.html', form=form)
表单.html
<script type="text/javascript">
$("#add-member").on('click', function(event){
$.ajax({
url: "{{ url_for('add_member') }}",
type : "POST",
//dataType : 'json', // data type
data : $("#main-form").serialize(),
success : function(result) {
console.log(result);
$("#members").html(result);
},
error: function(xhr, resp, text) {
console.log(xhr, resp, text);
}
});
event.preventDefault();
});
</script>
<form method="post" action="{{ url_for('main_form') }}" id="main-form">
{{ form.hidden_tag() }}
{{ form.name.label }} {{ form.name }}
<fieldset class="form-group border p-2">
<span id="members">{% include 'members.html' %}</span>
<div class="form-row">
{{ form.add_member(id="add-member") }}
</div>
</fieldset>
</form>
成员.html
<span class="h3">Members</span>
{% if form.members%}
<div class="form-row">
<div class="col-1 form-group">Name</div>
</div>
{% endif %}
{% for member in form.members %}
<div class="form-row">
{% for field in member %}
<div class="col-1 form-group">{{ field(class="form-control") }}</div>
{% endfor %}
</div>
{% endfor %}
关于jquery - 使用 AJAX 通过 Flask-WTForms 将条目附加到 FieldList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49066046/