1 回答
TA贡献2041条经验 获得超4个赞
问题与您如何构建它有关。我会给你关于正在发生的事情和解决方案的建设性反馈。
你提到
1.
例如,如果用户重复单击一个最初未选中的复选框,打印语句将是这样的:
[15/Jul/2020 16:11:51] "POST /uni/finishAssignment HTTP/1.1" 200 0
True
saving to true
[15/Jul/2020 16:11:52] "POST /uni/finishAssignment HTTP/1.1" 200 0
True
saving to true
这是True因为这<input type="checkbox" onclick='assignmentFinish("True","{{assignment.id}}")'>将调用ajax值为 的请求True。在views.py它将执行以下块
if status == 'True':
print("saving to true")
assignment.status = True
所以上面显示的打印行为是完全正常的,因为这个块将被重复执行。
2.
但是打印语句应该在 true 和 false 之间交替。出现这种情况的原因可能是显示复选框的页面上的信息未更新。
这是正确的,因为您没有在任何地方更新复选框的值,并且您始终假定值是明确的true和false。
解决方案: 要解决此问题,您需要修改您的js函数,使其将作为element第一个参数和assignment.id第二个参数。在其中,您需要通过使用checkedstatus属性直接获取复选框的值来更新参数。
<td scope="row" style="text-align: center">
<form>
{% csrf_token %}
{% if assignment.status %}
<input type="checkbox" checked onclick='assignmentFinish(this,"{{assignment.id}}")'>
{% else %}
<input type="checkbox" onclick='assignmentFinish(this,"{{assignment.id}}")'>
{% endif %}
</form>
</td>
function assignmentFinish(element,assignment) {
link = "{% url 'uni:finish-assignment' %}";
$.ajax({
type:'POST',
url: link,
data:{
status: element.checked ,
assignmentID: assignment,
csrfmiddlewaretoken:$('input[name=csrfmiddlewaretoken]').val()
},
success: function(){
}
});
}
现在您将传递复选框的实际值,它应该按照您期望的方式运行。
添加回答
举报