Python Flask WTForms Зависимый выпадающий - PullRequest
0 голосов
/ 23 октября 2018

Мне было интересно, может ли кто-нибудь мне помочь.

Я хочу иметь возможность нажимать на клиентов и местоположения, основанные на конкретном клиенте, будучи зависимым раскрывающимся списком.Эта информация поступает из базы данных, отсюда и запросы в следующем коде.

Это моя функция формы как для клиента, так и для местоположения

class CustomerPick(SubForm):
    customer = QuerySelectField(u'Customer',
                            get_label=u'sCustomer',
                            query_factory=lambda : 
                            (TCustomer.query.order_by(TCustomer.sCustomer)),
                            validators=[DataRequired(),])
    location = QuerySelectField(u'Location',
                            get_label=u'sLocation',
                            query_factory=lambda : 
                            (TLocation.query.order_by(TLocation.sLocation)),
                            validators=[DataRequired(),])

Вот часть просмотра

@route('new/', methods=['GET', 'POST'])
def new(self):
    form = CustomerPick()
    if form.validate_on_submit():

Это изображение раскрывающегося списка также для справки. Если вам, ребята, нужно что-то еще сделать, пожалуйста, дайте мне знать.Заранее спасибо! Фото

1 Ответ

0 голосов
/ 03 ноября 2018

Я не совсем понимаю ваш вопрос, но вы хотите иметь возможность щелкнуть пользователя и заполнить раскрывающийся список в зависимости от местоположения?

Это включает в себя некоторые Ajax, отправляющие данные туда и обратно.Я дам вам свернутую версию фрагмента кода (не тестировалась).

 // front-end - this handles user behavior in dropdown. When a user changes a value
 // in a user drop down, it will send a request to your Flask view function.
 $("#user_drop_down").change(function () {
        let user_identifier = this.value;
        $.ajax({
            type: "GET",
            url:/url_to_flask_view_function/,
            data: {user_identifier: user_identifier},
            success: function (resp) {
                $('#your_designated_div_for_both_dropdowns_div').html(resp.data)
            }
        });
    });

# back-end - this receives the request sent from front-end and process the Flask-WTF
# form options so that it can render different options in the dropdowns. In this view
# function, we will return jsonified template with newly processed form_object
# instead of rendering the option data. You can return the json with only the data
# but it involves more javascript parsing and may be difficult for you.
@app.route('/url_to_flask_view_function/')
def form_processing():
    user_identifier = request.args.get('user_identifier)
    # now we've gotten the user_identifier, you will need to query. Below query is totally made up.
    query_to_where_location = Location.query.filter(Location.user_identifier= user_identifier).first()
   # your query result will not be in a tuple format
   # if your query result is like this "locA, locB, locC, locD", you need to process
   # it so that you make [('locA', 'locA'), ('locB', 'locB').......] 
   form_object = MyForm()

    form_object.location.choices = processed_list
    return jsonify({"data":render_template('template_that_contains_your_drodpdowns.html',
                                   form_obj=form_obj)})

<!-- HTML piece, you should've had this already but make sure to specify your fields in HTML following Jinja2 synthax.-->
<form>
{{form_object.user}}
{{form_object.dropdown}}
</form>

В заключение, идея заключается в том, что вы ловите поведение пользователя, используя .change, а затем на основе изменений вы будетеотправить запрос с идентификатором пользователя на серверную часть.Как только он достигнет серверной стороны, вы сделаете запрос в БД и снова отобразите тот же шаблон с различными формами обработки.

Лучший способ сделать это состоит в том, что, как только вы получите user_identifier в свойПредставьте, вы делаете запрос и возвращаете jsonified объект местоположения, затем в своем блоке успеха вы изменили бы этот выпадающий элемент ввода.

Дайте мне знать, если у вас есть еще вопросы.

...