我有一个动态生成的 HTML 文件,显示从 API 请求收集的类的测验。在此页面中,我有一个扫描按钮,可以扫描选定的测验并在后端启动 python 脚本。单击扫描按钮时,我需要将该特定类数据发送回我的视图文件,以便我可以在后端启动 API 请求以进行扫描。
我遇到的问题是,当按下扫描按钮时,只有列表中的最后一个元素(动态生成的 html 页面)被发送回我的 views.py 文件。
如何在单击按钮时设置我的 POST 请求以处理动态数据,以便发回的数据是正确的。
下面的图片将显示正在发生的事情。
动态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 页面代码中)
提交按钮始终以表单形式发送所有数据,使用“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>