Я хочу объединить jQuery, AJAX и Flask, но не могу получить ответ от сервера для записи в шаблон - PullRequest
1 голос
/ 31 января 2020

Я разрабатываю форму для создания семейств в приложении базы данных Flask. По сути, пользователь может искать клиентов в базе данных, и в каждой строке результатов поиска будет кнопка «Добавить». Когда пользователь нажимает кнопку, клиент появляется в списке в верхней части формы. После добавления всех клиентов пользователь может нажать другую кнопку, которая создаст семейство и зафиксирует изменения в базе данных.

Я успешно связал кнопку «Добавить» с запросом AJAX и вижу ее на выходе консоли (с правильной информацией) всякий раз, когда щелкаю по ней, но не могу на всю жизнь Я понимаю, как вернуть все необходимые данные с сервера и записать их в шаблон.

Я включил соответствующий код ниже. Я чувствую, что ошибка лежит где-то в моей функции маршрутизации, но, поскольку я новичок в AJAX, jQuery и JavaScript, мне трудно точно сказать, что происходит не так. Пожалуйста, отправьте помощь!

rout.py

@app.route('/create_family', methods = ['GET','POST'])
def create_family():
    prefill = {'created_by':current_user.id}
    form = CreateFamily(data = prefill)
    # This if block handles the client search
    if form.validate_on_submit():
        clients = Client.query
        if form.first_name.data:
            clients = clients.filter(Client.first_name.like('%{}%'.format(form.first_name.data)))
        if form.last_name.data:
            clients = clients.filter(Client.last_name.like('%{}%'.format(form.last_name.data)))
        return render_template('create_family.html', form = form, clients = clients.all())
    # Logic for the AJAX 'GET' request
    elif request.method == 'GET':
        if request.args.get('clientID'):
            clientid = request.args.get('clientID')

            # Queries DB for client information
            client = Client.query.filter(Client.id == clientid).first()

            # HTML to insert to the family table in the form
            row = '<tr><td>{}</td><td>{}</td><td>{}</td><td>{}</td><td>{}</td></tr>'.format(client.id,client.first_name,client.last_name,client.gen.gender,client.dob.strftime('%m-%d-%Y'))

            # I'm not sure if this is right, or how I should change it
            return jsonify(result=row)
    else:
        return render_template('create_family.html', form = form)
return render_template('create_family.html', form = form)

create_family. html

<html>
    <head>
      <link rel="stylesheet" href="{{ url_for('static', filename = 'styles/main.css') }}">
      <script src="{{url_for('static', filename='javascriptfile.js')}}"></script>
      <script src="http://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    </head>
<body>

<!-- I omitted some of the template for brevity -->

<!-- This is the table I want to add to-->
<table class="familyView">
        <tr class="familyHeader">
            <th>Client ID</th>
            <th>First Name</th>
            <th>Last Name</th>
            <th>Gender</th>
            <th>Date of Birth</th>
        </tr>
    </table>


<!-- I omitted some of the template for brevity -->

<!-- This is the table I want to add to-->
<form action="" method="post"><br>
{% if clients %}
    <table class="clientView">
    <tr>
        <th>Client ID</th>
        <th>First Name</th>
        <th>Last Name</th>
        <th>Gender</th>
        <th>Date of Birth</th>
    </tr>
    {% for c in clients %}
    <tr>
        <td class="clientID">{{ c.id }}</td>
        <td>{{ c.first_name }}</td>
        <td>{{ c.last_name }}</td>
        <td>{{ c.gen.gender }}</td>
        <td>{{ c.dob.strftime('%m-%d-%Y') }}</td>
        <td><button class="addBtn" type ="button">Add</button></td>
    </tr>
    {% endfor%}
</table>
</form>
{% endif %}

javascriptfile. js

window.onload=function(){

$(".addBtn").click(function() {
    var $recordToAdd = jQuery(this).closest('tr').find('.clientID').text();
    console.log("clientid: " + $recordToAdd);

    $.ajax({
        cache: false,
        url: 'create_family',
        type: 'GET',
        data: {'clientID': $recordToAdd,},
        success: function(response) {
            console.log(response);
        },
        error: function(error){
            console.log(error);
        }
    })
});

}

1 Ответ

0 голосов
/ 03 февраля 2020

Здесь есть пара проблем. Прежде всего, когда я обновлял страницу, я не обновлял javascript. Сделав hard-reset (Shift + F5), я смог выяснить некоторые другие проблемы.

Во-вторых, когда я пытался добавить строку из таблицы внизу страницы вместо верхней, я пытался использовать ненужный запрос ajax. Этот шаг можно выполнить всего с помощью jQuery

$(document).on("click", ".addBtn", function() {
        var tr = $(this).closest('tr').clone();
        tr.find("input").attr("class", "rmBtn");
        tr.find("input").attr("value", "Remove from Family");
        $(".familyView").append(tr);
    });

В-третьих, мне пришлось переписать функцию в routes.py, чтобы изменить некоторые вещи в моем подходе. Я изменил его так, чтобы результаты поиска отображались с использованием AJAX и jQuery, чтобы не приходилось обновлять страницу каждый раз при новом поиске.

@app.route('/create_family', methods = ['GET','POST'])
def create_family():
    prefill = {'created_by':current_user.id}
    form = CreateFamily(data = prefill)
    if (request.method == 'GET') and request.args.get('client_ids'):
        ids = request.args.get('client_ids').split(',')
        print('ids: {}'.format(ids), file = sys.stderr)
        program = request.args.get('program')
        if len(ids) != 0:
            new_family = Family(program_id = program, 
                                created_date = datetime.utcnow(), 
                                created_by = current_user.id)
            db.session.add(new_family)
            db.session.flush()
            fam_id = new_family.id
            for cid in ids:
                new_mem = FamilyMember(family_id = fam_id, client_id = cid)
                db.session.add(new_mem)
            data = {'message': 'Family {} created at {}'.format(fam_id, new_family.created_date), 'code':'SUCCESS'}
            db.session.commit()
            return make_response(jsonify(data), 201)
        elif len(ids) == 0:
            print('this is an error', file = sys.stderr)
            data = {'message': 'Cannot create a family with no members', 'code':'ERROR'}
            return make_response(jsonify(data), 401)
    return render_template('create_family.html', form = form, client = client)

Я знаю, что это не лучшее объяснение того, что я исправил, но теперь, когда я на несколько дней удален от первоначального вопроса, я не могу точно вспомнить, что доставляло мне больше всего хлопот ,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...