Обновление позже ... Я наконец-то решил свою проблему.Мне просто интересно, есть ли способ сделать это больше элегантно ?
Я в самом начале программирования с 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
)