POST 请求 Django 中发送回 views.py 的动态数据

问题描述 投票:0回答:1

我有一个动态生成的 HTML 文件,显示从 API 请求收集的类的测验。在此页面中,我有一个扫描按钮,可以扫描选定的测验并在后端启动 python 脚本。单击扫描按钮时,我需要将该特定类数据发送回我的视图文件,以便我可以在后端启动 API 请求以进行扫描。

我遇到的问题是,当按下扫描按钮时,只有列表中的最后一个元素(动态生成的 html 页面)被发送回我的 views.py 文件。

如何在单击按钮时设置我的 POST 请求以处理动态数据,以便发回的数据是正确的。

下面的图片将显示正在发生的事情。

html页面图片

动态HTML页面代码

<div class="container">
        <form method="post">
            {% csrf_token %}
        {% for quiz in assignment_data %}
            <div class="assignment hide-content">
                <div class="row assignment-header">
                    <div class="col">{{quiz.title}}</div>
                    <div class="col">published: {{quiz.published}}</div>
                    <div class="col">Questions: {{quiz.question_count}}</div>
                    <div class="col-sm toggle-col">
                        <i class="toggle-drop-icon drop-icon-down fa-sharp fa-solid fa-caret-down"></i>
                        <i class="toggle-drop-icon drop-icon-up fa-sharp fa-solid fa-caret-up"></i>
                    </div>
                </div>
                <div class="row assignment-content">
                    <div class="col">
                        <button class="button" type="submit" id="scan-quiz" name="run_webscrape" onclick="this.classList.toggle('button--loading')">
                            <span class="button-text">Scan</span>
                            <input type="hidden" name="quiz_id" value="{{quiz.id}}">
                            <input type="hidden" name="quiz_name" value="{{quiz.title}}">
                        </button>
                    </div>
                    <div class="col">
                        Cheatability
                        <br>
                        <span class="grey">0/{{quiz.question_count}}</span>
                    </div>
                    <div class="col">
                        Last Scan
                        <br>
                        <span class="grey">Not Scanned</span>
                    </div>
                    <div class="col">
                        <a href="#" disabled>View Results</a>
                    </div>
                </div>
            </div>
        {% endfor %}
        </form>
    </div>

在 views.py 中发布请求

    def post(self, request, class_id):
        if request.method == 'POST' and 'run_webscrape' in request.POST:
            # get user profile form
            # base information for authentication to canvas
            # grab canvas token out of database for canvas auth
            user_token = Profile.objects.filter(user=request.user).values_list('canvas_api_token', flat=True)
            api_token = str(user_token[0])

            user_quiz_data = Profile.objects.filter(user=request.user).values_list('teacher_data', flat=True)
            teacher_data_string = user_quiz_data[0]

            if not teacher_data_string:
                print("No data yet for this teacher")
                teacher_data = list(teacher_data_string)
            else:
                teacher_data_string_edit = [teacher_data_string]
                teacher_data_list = [json.loads(idx.replace("'", '"'), strict=False) for idx in teacher_data_string_edit]
                teacher_data = teacher_data_list[0]



            # set the quiz id of the selected quiz to scan
# THIS DATA RIGHT HERE NEEDS TO BE DYNAMIC
********************************************************************************
            quiz_id = int(request.POST['quiz_id'])
            quiz_name = request.POST['quiz_name']
#*******************************************************************************

            # Create data block entry to save quiz information into database

            # vars for Canvas authentication
            canvas_api_url = "https://canvas.instructure.com/api/v1"
            header = {
                "Authorization": f"Bearer {api_token}"
            }
            webscrape(canvas_api_url, header, quiz_id, class_id, quiz_name, teacher_data, request)

            return redirect(to="home-view")

打印出来的终端数据以仔细检查我得到的数据是否正确 ** 5640376 13368555 测试科学测验 2 多种变体 **

作为参考,我点击了 Science Test Quiz 1 的扫描按钮,但得到了 Test Science Quiz 2 Multiple Variations 的数据。这也适用于每个班级页面。它只会发回 HTML 页面上 for 循环中的最后一次交互(for 循环显示在 HTML 页面代码中)

python html django post dynamic
1个回答
0
投票

提交按钮始终以表单形式发送所有数据,使用“id”{{quiz.id}}“”并为您的提交按钮提供动态 ID 和动态名称,然后在后端检查提交按钮是否已单击,然后执行一些操作

或 你应该从'type="submit"'以外的任何东西创建按钮并使用JS将数据发送到API或后端

动态提交按钮 这段代码很简单

<form action="test.php" method="post">
    <input type="hidden" id="data1" name="data1" value="data1">
    <input type="hidden" id="data2" name="data2" value="data2">
    <button class="button" type="submit" id="submit1" name="submit1">send</button>
        <button class="button" type="submit" id="submit2" name="submit2">send</button>
</form>
© www.soinside.com 2019 - 2024. All rights reserved.