如何用ajax调用返回的数据填充特定的SelectField?

时间:2019-03-27 04:24:11

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

稍后更新... 我终于解决了我的问题。我只是想知道是否有一种方法可以做到更多 优雅

我刚开始使用Python3FlaskJquery进行编程。

我的目标是使一个SelectField根据另一个SelectField的选项更改其值。就像当我选择美国作为国家/地区时,然后在Ajax帮助下自动从数据库中加载州(例如,纽约/华盛顿,哥伦比亚特区/ ...)。

现在我可以使用ajax调用获取数据,这意味着我可以在Browser的调试模式下看到响应。我只是不知道如何用响应数据填充特定的SelectField。以下是相关的代码段。在此先感谢您的时间。

choose.html

<html>
<head>...</head>
<body>
...
<div class="row">
  <form action="{{url_for('some_view_function')}}" method="post">
    ...
    <div class="col-md-4 col-sm-4 col-xs-12">
      {{ form.country(class="form-control select2_single") }}
    </div>
    <div class="col-md-4 col-sm-4 col-xs-12">
      {{ form.state(class="form-control select2_single") }}
    </div>
    ...
  </form>
</div>
...
<script>
    $(document).ready(function(){
      $("#country").change(function(){
          country_id=$("#country").val();
          $.get("{{ url_for('get_states_by_country') }}",
                {"country_id":country_id},
                function(data, status){
                    if (status == 'success') {
                        // What should I do here with data?
                    }
          });
      });
  });
</script>
</body>
</html>

view_function.py

@app.route('/obtain/states', methods={'GET', 'POST'})
def get_states_by_country():
    country_id = request.args.get("country_id")

    states = State.query.filter_by(
        country_id=country_id
    )
    return jsonify(
        {int(s.state_id): s.state_name
         for s in states}
    )

form.py

class LinkChooseForm(Form):
    country = SelectField(label='Country')
    state = SelectField(label='State')

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.country.choices = [(c.id, c.name) for c in Country.query.all()]
        self.state.choices = [] # I leave it empty when initiating

更新1:
数据为json格式。模拟数据如下。 key将是value中的<option>,而value将是text中的<option>

{
  "bash", "desc_for_bash",
  "csh", "desc_for_csh",
  ...
}   

更新2:
在@Deepak的帮助下,我终于解决了这个问题。我在@Deepak的答案(表单不接受选择选项)下提到的问题发布了错误。实际上,form确实接受了我的html页面上的选择选项。我调试了一下,发现我错过了在动作函数中重设state.choices的机会。您可能会注意到,我在初始化表单对象时将state.choices留空。但是flask-wtf可以验证是否您在页面上的选择是state.choices之一。显然不是,因为我将其保留为空。因此,我必须使用request.form.get('state')重置它才能满足flask-wtf的验证。下面是提交功能。

@app.route('/test', methods={'GET', 'POST'})
def some_view_function():
    form = LinkChooseForm(**request.view_args)

    if request.method == 'POST':
        # The most important part here.
        form.state.choices = [(request.form.get('state'), "")]

        if form.validate_on_submit():
            action_entity = ActionEntity()
            action_entity.do(form)
            return redirect(url_for('.another_view_function'))
        else:
            # reset it as empty again
            form.state.choices = []

    return render_template(
        'result.html',
        form=form
    )

1 个答案:

答案 0 :(得分:1)

var data = '{"bash":"desc_for_bash","csh":"desc_for_csh, city"}';//Your JSON data
data = JSON.parse(data);                                        //To parse your JSON data
var str=''
for(d in data)
str+='<option value="'+d+'">'+data[d]+'</option>'

$("#your_select_id").html(str)                                 //For adding options to select