jquery - 使用 AJAX 通过 Flask-WTForms 将条目附加到 FieldList

标签 jquery ajax python-3.x flask flask-wtforms

我使用 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/

相关文章:

jquery - 如何使用 jQuery 从此 json 中选择数据?

javascript - 就像按钮增量计数器不起作用。 PHP、AJAX、MySQL、javascript

python-3.x - 重新启动 Airflow 调度程序

python - 从 Python 3 中的可迭代对象生成值元组

javascript - jQuery 表单提交似乎不会触发 if 语句

javascript - 使用 bootstrap-multiselect 在多选框中添加选项

php - 使用 javascript/ajax 提交具有不同输入类型的 php 表单

python-3.x - 在 Pytest fixture 中使用时,Python 日志记录不会记录

jquery - 无法将 CSS 和 jQuery 获取到程序输出中

javascript - js客户端与asp.net服务器通信