Как заполнить определенный SelectField данными, возвращаемыми при вызове ajax? - PullRequest
1 голос
/ 27 марта 2019

Обновление позже ... Я наконец-то решил свою проблему.Мне просто интересно, есть ли способ сделать это больше элегантно ?

Я в самом начале программирования с Python3, Flask и Jquery.

Я стремлюсь сделать так, чтобы один SelectField изменил свое значение (я) на основании другого SelectField параметра.Точно так же, когда я выбираю США в качестве страны, то автоматически загружаю штаты (скажем, Нью-Йорк / Вашингтон, округ Колумбия / ...) из базы данных с помощью ajax.

Теперь я мог получать данные с помощью вызова ajax, что означает, что я мог видеть ответ в режиме отладки браузера.Я просто не знаю, как заполнить конкретный 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 Ответ

1 голос
/ 27 марта 2019
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...