Jel*_*aag 6 ajax jquery flask python-3.x flask-wtforms
我使用Flask-WTForms在Flask中制作了一个简单的表单,父母可以在其中注册自己和他的孩子。父母可以通过单击“添加孩子”按钮来注册任意数量的孩子。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()
Run Code Online (Sandbox Code Playgroud)
我的路线:
@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)
Run Code Online (Sandbox Code Playgroud)
register.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>
Run Code Online (Sandbox Code Playgroud)
我认为这应该有效。除非有任何错别字。
视图.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)
Run Code Online (Sandbox Code Playgroud)
表单.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>
Run Code Online (Sandbox Code Playgroud)
会员.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 %}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |