Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确地将表单与AJAX集成以动态添加字段?_Javascript_Python_Ajax_Flask_Wtforms - Fatal编程技术网

Javascript 如何正确地将表单与AJAX集成以动态添加字段?

Javascript 如何正确地将表单与AJAX集成以动态添加字段?,javascript,python,ajax,flask,wtforms,Javascript,Python,Ajax,Flask,Wtforms,我是ajax编程的初学者,请耐心听我说 我想做的是允许用户在单击按钮时添加表单字段,如下所示: 对于主窗体,我有以下代码 class EnrollForm(FlaskForm): known_for = StringField('Known for', validators=[ Length(max=LONG_STRING) ] ) soc_med_info = FieldList(FormField(SocialMediaForm), min_en

我是ajax编程的初学者,请耐心听我说

我想做的是允许用户在单击按钮时添加表单字段,如下所示:

对于主窗体,我有以下代码

class EnrollForm(FlaskForm):
  known_for = StringField('Known for',
    validators=[
      Length(max=LONG_STRING)
    ]
  )

  soc_med_info = FieldList(FormField(SocialMediaForm), min_entries=1)
这是它的子表单/formfield

class SocialMediaForm(Form):
  social_media = SelectField('Where can we find you?', coerce=str)

  other = StringField(validators=[
    Length(max=MEDIUM_STRING)
  ])

  handle = StringField('Handle',
    validators=[
      Length(max=SHORT_STRING)
    ]
  )

  followers = StringField('Followers',
    validators=[
      Length(max=SHORT_STRING),
      Regexp('^\d*[kmKM]$', message='Input number of followers')
    ]
  )
html(enroll.html)

“删除行”功能尚未实现。 预期结果是连续添加字段行,但是,即使重复单击按钮,也只添加一个字段行

我假设这是因为在视图代码中,“add_soc_med()”;我正在重新初始化注册表单。我要做的是保留“enroll()”函数中的表单,访问soc\u med\u info字段列表并附加一个条目

我只是不知道该怎么办

我用Jelle van der Zwaag的答案来回答这个问题:

<div class="row">
    <div class="col-lg-12">
        <form method="POST"
        action="{{url_for('user.enroll')}}"
        id="enroll-form">
          {{ form.hidden_tag() }}
            <fieldset class="form-group">
              <legend>
                  Be one of us
              </legend>
              <div class="form-group">
              {{ form.known_for.label(class="form-control-label") }}

              {% if form.known_for.errors %}
                {{ form.known_for(class="form-control form-control-sm is-invalid")}}
                <div class="invalid-feedback">
                  {% for error in form.known_for.errors %}
                      <span>{{ error }}</span>
                  {% endfor %}
                </div>
              {% else %}
                {{ form.known_for(class="form-control form-control-sm")}}
              {%endif%}
            </div>
            <fieldset>
                <legend>
                    Social Media Information
                </legend>
                <span id="platforms">
                  {% include 'pages/user/platforms.html' %}
                </span>
            </fieldset>
          </fieldset>
        </form>
    </div>
</div>
{% for soc_med in form.soc_med_info %}
  <div class="row">
      <div class="col-md-4">
          <div class="form-group">
            {{ soc_med.social_media.label(class="form-control-label") }}

            {% if soc_med.social_media.errors %}
              {{ soc_med.social_media(class="form-control form-control-sm is-invalid")}}
              <div class="invalid-feedback">
                {% for error in form.social_media.errors %}
                    <span>{{ error }}</span>
                {% endfor %}
              </div>
            {% else %}
              {{ soc_med.social_media(class="form-control form-control-sm")}}
            {%endif%}
          </div>
      </div>
      <div class="col-md-4">
          <div class="form-group">
            {{ soc_med.handle.label(class="form-control-label") }}

            {% if soc_med.handle.errors %}
              {{ soc_med.handle(class="form-control form-control-sm is-invalid")}}
              <div class="invalid-feedback">
                {% for error in form.handle.errors %}
                    <span>{{ error }}</span>
                {% endfor %}
              </div>
            {% else %}
              {{ soc_med.handle(class="form-control form-control-sm")}}
            {%endif%}
          </div>
      </div>
      <div class="col-md-2">
          <div class="form-group">
            {{ soc_med.followers.label(class="form-control-label") }}

            {% if soc_med.followers.errors %}
              {{ soc_med.followers(class="form-control form-control-sm is-invalid")}}
              <div class="invalid-feedback">
                {% for error in form.followers.errors %}
                    <span>{{ error }}</span>
                {% endfor %}
              </div>
            {% else %}
              {{ soc_med.followers(class="form-control form-control-sm")}}
            {%endif%}
          </div>
      </div>
      <div class="col-md-2">
          <div class="form-group">
            {% if loop.index == 1 %}
              <button type="button"
              id="add-soc-med-btn">
                  Add Item
              </button>
            {% else %}
              <button type="button">
                  X
              </button>
            {% endif %}
          </div>
      </div>
  </div>
{% endfor %}
<script type="text/javascript">
    $("#add-soc-med-btn").on("click", function(evt){
        evt.preventDefault();
        $.ajax({
          url: "{{url_for('user.add_soc_med')}}",
          type: "POST",
          data: $("#enroll-form").serialize(),
          success: function(data) {
            console.log(data)
            $('#platforms').html(data)
          },
          error: function(xhr, resp, text){
            console.log(xhr, resp, text)
          }
        });
    });
</script>
@user.route('/enroll', methods=['GET', 'POST'])
@login_required
def enroll():
  form = EnrollForm()

  # Initialize form
  for soc_form in form.soc_med_info:
    soc_form.social_media.choices = soc_med_platforms

  if form.validate_on_submit():
    return doEnroll(request, form)

  return render_template('pages/user/enroll.html', form=form)

def doEnroll(request, form):
  pass

@user.route('/enroll/add/social_media', methods=['POST'])
@login_required
def add_soc_med():
  form = EnrollForm(request.form)
  form.soc_med_info.append_entry()
  for soc_form in form.soc_med_info:
    soc_form.social_media.choices = soc_med_platforms

  return render_template('pages/user/platforms.html', form=form)