在我的Django项目中,我有一个显示特定模型的所有实例的页面。我想每隔几秒自动刷新一次页面,但只更新页面的相关部分。
我将描述每个部分。首先 - 我有一个Django视图。在最简单的形式,它看起来像这样
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! videoCellCollectionViewCell
let video = "https://www.youtube.com/watch?v=DGRC1DV7b78"
cell.video = video
return cell
}
因此它从数据库中找到所有class MyListView(ListView):
lookup_field = 'uuid'
model = Foo
template_name = 'mylist.html'
def get_queryset(self):
return list(Foo.objects.all()) # finds all my objects from DB
def get_context_data(self, **kwargs):
objects = self.get_queryset()
context = super(MyListView, self).get_context_data(**kwargs)
context['foos'] = objects # this gets passed to html page
return context
个对象并将其返回给html。
html页面显示一个表,其中每个条目都是一行。此外,每行的开头都有一个复选框。喜欢这个
Foo
现在,<table id="content">
<thead>
<tr>
<th><input type="checkbox" id="chckHead"/></th>
<th>UUID</th>
<th>Attribute1</th>
<th>Attribute2</th>
</tr>
</thead>
<tbody>
{% for item in foos %}
<tr id="{{ item.uuid }}">
<td>
<input type="checkbox" name="checkboxlist" class="chcktbl" />
</td>
<td><code>{{ item.uuid }}</code></td>
<td>{{ item.attribute1 }}</td>
<td>{{ item.attribute2 }}</td>
</tr>
{% endfor %}
</tbody>
</table>
模型的某些属性可能会在后台更新,因此我想以某种方式定期使用新数据刷新页面。
我是用javascript做的,就像这样
Foo
所以每隔5秒,JS会调用 function setup() {
setTimeout("refreshPage();", 5000);
}
function refreshPage() {
window.location = location.href;
}
$(document).ready(setup);
,我的页面会刷新。如果在幕后更改了数据库,我的页面就会反映出来。
以上问题是它刷新整个页面,其中包括复选框。因此,如果我已经选择了一个复选框,则刷新会将其重置为其原始状态(“未选中”)。
那么,解决这个问题的正确方法是什么?
答案 0 :(得分:0)
真的很高级别:
您要添加的window.location
将重置整个页面。到这个时候你已经想出来了。您正在寻找的是可以通过使用页面部分或使用REST端点并将其推回模板来处理的事情。
以下是您需要refreshPage
进行预处理的步骤。
如果他们当前正在编辑区域,那么你很可能会想要等待刷新页面(保存第1步和第4步)。那可能是你已经投票反对的选择。
我希望这有帮助,这是一个非技术性的答案,但我不确定如果不了解你的项目,我会给你一个非常具体的答案。