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(){
}
});
}
現在您將傳遞復選框的實際值,它應該按照您期望的方式運行。
添加回答
舉報