我有django-tables2设置并且运行良好。我已将表设置为能够直接从显示的列表中更新复选框列。但是,当我显示的表格分页并更新一个值时,它会刷新整个页面,从而将我发送回第一页,然后我必须单击“下一步”才能返回到我所在的位置。因此我认为将knockout.js放入混合中以将我的各个列绑定到postgres数据库中的相应数据可能是个好主意。根据模糊,这将允许我简单地刷新点击的项目而无需刷新整个页面。我阅读了knockout.js的教程,看起来很棒,而且正是我要找的。我修改了我的观点并编写了我的js文件等,我几乎就在那里。我有来自views.py的JSONResponse返回正确的行数,但是,我的django-tables2表将每个记录渲染为我的表中的标题(即th)而不是数据作为行(即td)。感觉就像我在最后一道障碍中摔倒一样,我想知道是否有人可以解释我如何解决这个难题的最后一点。
view.py
def mydatalist(request):
data = []
user = get_current_user()
query = Q(user_fkey=user.id)
query.add(Q(deleted__isnull=True), Q.AND)
query.add(Q(master=True), Q.AND)
tasks = Task.objects.filter(query)
for task in tasks:
data.append({"code":task.code, "name":task.name, etc})
return JsonResponse(data, safe=False)
我的.js文件
function Task(data) {
this.code = ko.observable(data.code);
this.name = ko.observable(data.name);
etc
}
function TaskListViewModel() {
// Data
var self = this;
self.tasks = ko.observableArray([]);
$.getJSON('http://myweb.org/tasks/mydatalist/', function (data) {
if(data){
var mappedTasks = $.map(data, function (item) {
return new Task(item);
});
} else {
alert('data empty!');
}
self.tasks(mappedTasks);
});
}
ko.applyBindings(new TaskListViewModel());
我的django-tables2 tables.py文件
class MasterTable(ColumnShiftTable):
code = tables.Column(attrs={'th':{'class':'centered nodec'}})
name = tables.LinkColumn(attrs={'th':{'class':'centered nodec'}})
etc
class Meta:
model = Task
fields = ('code','name', etc)
template_name = 'django_tables2_column_shifter/bootstrap3.html'
attrs={'id':'masterlist', 'class': 'table table-noborder', 'data-bind': 'foreach: tasks, visible: task().length > 0'}
row_attrs={'id': lambda record: record.pk}
所以基本上一切都很有效,除了渲染时,我的django-tables2表渲染了11个标题而没有数据行而不是1个标题和10个数据行。
如果有人可以放弃任何光线,我真的很感激它,或者如果有人可以提出另一种方法来实现不必每次刷新整个页面,那也会很棒。