好的,现在我想出了这个 JavaScript/jQuery 解决方案。它涉及两个方面。首先,当表格的排序顺序改变、表格被过滤或导航到另一个页面并再次返回表格时,存储和显示选中的复选框。其次,当单击表头上的“全选”按钮时,检查并存储表页上的所有复选框。在这里,我坚持选择表格中的所有行,而不仅仅是显示在一个表格页面上的行(打开分页)。选中的复选框存储在浏览器的会话存储中。功能肯定有改进的余地,我不太喜欢对表的所有行进行迭代,但我还没有找到更好的解决方案。
我仍然认为在 django-tables2 中提供这种功能会很好。也许在未来的某个版本中?
复选框列在我的 tables.py 中称为“selvars”
class dataset_varsTable(tables.Table):
selvars=tables.CheckBoxColumn(accessor='pk',attrs = { "th__input": {"onclick": "toggle(this)"}}, orderable=False)
... (other table columns)
这是我的模型的整数主键
class vars(models.Model):
idvar=models.IntegerField('Var.ID', primary_key=True)
...
以及 HTML 模板中的 JavaScript 和 jQuery 函数与表格
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script>
var storage_name="checkedvars"; // name of session storage
// function to store/remove checked varids in session storage
function update_checkedvars(varid, check_status){
var current_checked=[];
if (sessionStorage.getItem(storage_name)){
current_checked=sessionStorage.getItem(storage_name).split(",");
}
if (isNaN(parseInt(varid))==false && check_status==true){
current_checked.push(varid);
// store checked varid in session storage without duplicates
sessionStorage.setItem(storage_name, Array.from(new Set(current_checked)));
} else if (isNaN(parseInt(varid))==false && check_status==false){
// remove unchecked varid from session storage
sessionStorage.setItem(storage_name, current_checked.filter(e => e !== varid));
}
}
// toggle button
function toggle(source) {
checkboxes = document.getElementsByName('selvars');
for(var i in checkboxes){
checkboxes[i].checked = source.checked;
update_checkedvars(checkboxes[i].value, checkboxes[i].checked);
}
}
$(document).ready( function() {
// display checkboxes according to selected varids in session storage
var current_checked=[];
if (sessionStorage.getItem(storage_name)){
current_checked=sessionStorage.getItem(storage_name).split(",");
checkboxes = document.getElementsByName('selvars');
for(var i in checkboxes){
if(current_checked.includes(checkboxes[i].value)){
checkboxes[i].checked=true;
}
}
}
// save/remove checked/unchecked varid in session storage
$(".selvars").click( function(event) {
var varid=event.target.value
var check_status=event.target.checked
update_checkedvars(varid, check_status);
});
});
</script>