Способ различать guish разные AJAX функции в POST? - PullRequest
0 голосов
/ 24 января 2020

Мне нужно различать guish среди нескольких AJAX функций в методе POST django view для обработки нескольких форм.

Фон:

Ранее я писал это представление без AJAX, и все получалось нормально. До Ajax я мог различать guish метод POST для каждой формы, добавляя name = "some_button_name", например так:

if request.method == 'POST' and 'some_button_name' in request.POST: #check which form button submitted

Это было здорово, но AJAX может сделать это лучше, если я получу это работает. Теперь я не уверен, как отличить guish от функций ajax на стороне обзора.

Вот как я думаю должно работать (теоретический взгляд):

if request.method == 'POST' and request.POST['some identifier_A from ajax function here']:
    # do stuff
    # save form_A
if request.method == 'POST' and request.POST['some identifier_B from ajax function here']:
    # do stuff
    # save form_B
if request.method == 'POST' and request.POST['some identifier_C from ajax function  here']:
    # do stuff
    # save form_C

... но я в тупике. Ниже мой (упрощенный, но структурно точный) код. Конечно, он захочет вызвать метод сохранения каждой модели независимо от того, какая функция формы / ajax была вызвана, поэтому при сохранении форма C будет испорчена форма B , поскольку B * Обработчик 1055 * ничего не делал и не передавал JSON.

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

Если бы кто-то мог пролить свет на способ решить эту проблему, я был бы очень благодарен. Кроме того, я не уверен, имеет ли это отношение к этому вопросу, но я также хочу со временем добавить кнопку «сохранить все», которая запускает все функции ajax.

Views.py

def update_view(request, slug):

    mymodel = Model.objects.get(slug=slug)

    form_A  = Model_A_Form(instance=mymodel.model_a)
    form_B  = Model_B_Form(instance=mymodel.model_b)
    form_C  = Model_C_Form(instance=mymodel.model_c)

    if request.method == 'POST': # using request.is_ajax(): here causes the same problem

        form_A = Model_A_Form(request.POST, instance=mymodel.model_a)
        if form_A.is_valid():
            form_A.save()
            return JsonResponse

        form_B = Model_B_Form(request.POST, instance=mymodel.model_b)
        if form_B.is_valid():
            form_B.save() 
            return JsonResponse

        form_C = Model_C_Form(request.POST, instance=mymodel.model_c)
        if form_C.is_valid():
            form_C.save() 
            return JsonResponse

    context = {

        'form_A': form_A,
        'form_B': form_B,
        'form_C': form_C,
        'obj': mymodel,
    }

    return render(request, "products/update_form.html", context)

. JS

<script>
    $(() => {

        // Form A handler

        $(function () {
            $('#mybtn-a').click(function () {
                var formA = $(".form-a-ajax")
                var formAMethod = formA.attr("method");
                var formAEndpoint = formA.attr("action");
                formA.submit(function (event) {
                    event.preventDefault();
                    var formAData = formA.serialize()
                    var thisForm = $(this)
                    $.ajax({
                        method: formAMethod,
                        url: formAEndpoint,
                        data: formAData,
                        success: function (data) {
                            $.alter({
                                title: "Success!",
                            })
                        },
                        error: function (error) {

                        }

                    }) //end ajax
                });//end click
            })
        })

        // Form B handler

        $(function () { 
            $('#mybtn-b').click(function () {
                var formB = $(".form-b-ajax")
                var formBMethod = formB.attr("method");
                var formBEndpoint = formB.attr("action")
                formB.submit(function (event) {
                    event.preventDefault();
                    var formBData = formB.serialize()
                    var thisForm = $(this)
                    $.ajax({
                        method: formBMethod,
                        url: formBEndpoint,
                        data: formBData,

                        success: function (data) {
                            $.alter({
                                title: "Success!",
                            })
                        },
                        error: function (error) {

                        }

                    }) // end ajax
                });//end click
            })
        })

        // Form C handler

        $(function () {
            $('#mybtn-c').click(function () {
                var formC = $(".form-c-ajax")
                var formCMethod = formC.attr("method");
                var formCEndpoint = formC.attr("action")
                formC.submit(function (event) {
                    event.preventDefault();
                    var formCData = formC.serialize()
                    var thisForm = $(this)
                    $.ajax({
                        method: formCMethod,
                        url: formCEndpoint,
                        data: formCData,

                        success: function (data) {
                            $.alter({
                                title: "Success!",
                            })
                        },
                        error: function (error) {

                        }

                    }) //end ajax
                });//end click
            })
        })

Шаблон:

<form method="post" action="{{ obj.get_my_url }}" class="form-a-ajax">
    {% csrf_token %} {{ form_A }}
    <button type='submit' id="mybtn-a" name='save_form_a' class='btn btn-success'>Save</button>
</form>

<form method="post" action="{{ obj.get_my_url }}" class="form-b-ajax">
    {% csrf_token %} {{ form_B }}
    <button type='submit' id="mybtn-b" name='save_form_b' class='btn btn-success'>Save</button>
</form>

<form method="post" action="{{ obj.get_my_url }}" class="form-c-ajax">
    {% csrf_token %} {{ form_C }}
    <button type='submit' id="mybtn-c" name='save_form_c' class='btn btn-success'>Save</button>
</form>

1 Ответ

0 голосов
/ 25 января 2020

Спасибо всем за ваши отзывы! Ваши комментарии дали мне идею. У меня есть рабочее решение, и оно кажется совершенно простым после свершившегося факта. Нет необходимости добавлять что-либо к JSON в моем случае. У каждой модели есть уникальные имена полей; Мне просто нужно проверить наличие одного из них в JSON объекте пары ключ: значение. Это работает:

    if request.method == 'POST' and 'some_unique_model_field_name' in request.POST.keys():

        form_A = Model_A_Form(request.POST, instance=mymodel.model_a)
        if form_A.is_valid():
            form_A.save()
            return JsonResponse

        #rinse and repeat...

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