如何让Django的filer应用将新文件列在列表顶部?
我们正在使用django filer这个应用(版本0.9.5,http://django-filer.readthedocs.org/en/latest/index.html)来管理文件上传。这个应用运行得很好,但每次上传新文件时,它们总是出现在列表的底部,所以我们不得不在一大堆文件中滚动到最底部,才能找到刚上传的文件。我们希望新上传的文件能出现在列表的最上面。
我已经把filer移动到了我们的应用目录,这样就可以进行修改。目前,我尝试在/admin/folderadmin.py的第313行更改文件的排序方式。把排序的条件改成“-modified_at”后,排序功能就坏掉了。现在我在考虑修改文件模型的保存方法(在/models/filemodels.py中),想加入类似下面的代码:
...
if not self.id:
try:
folder = self.folder if self.folder else None
order_first = self.__class__.objects.filter(folder=folder).aggregate(
models.Min('order'))['order__min'] - 1
if order_first <= 1:
self.__class__.objects.filter(folder=folder).update(
order=models.F('order') + 1000)
self.order = 1000 + order_first
else:
self.order = order_first
except (TypeError, IndexError):
pass
super(File, self).save(*args, **kwargs)
我的想法是给最近上传的文件分配一个排序值,让它排在当前文件夹中最上面的文件之前,这样它就能在列表中最先显示。不幸的是,保存方法的使用方式比我知道的要多,这个方法现在并没有奏效。有没有什么想法可以帮助我们实现这个功能呢?
1 个回答
我觉得我找到了一个有效的解决办法。在/admin/folderadmin.py文件的第313行,有这么一行代码:
file_qs = file_qs.order_by('order')
把它改成:
file_qs = file_qs.order_by('-order')
这样做会把显示顺序反转,让最新的项目在列表中最先出现。不过,单独这样做会导致排序功能失效。我们有一些照片库,文件需要按照特定的顺序出现,所以排序非常重要。为了解决这个问题,我们还需要在/filer/views.py文件中修改排序的视图,把
for pk in request.POST.getlist('indexes'):
替换成
index_list = request.POST.getlist('indexes')
index_list.reverse()
for pk in index_list:
当新的索引被提交时,系统并不知道整个目录的内容已经被故意反转了,所以如果不反转这个列表,每次我们移动文件时,目录的内容都会被颠倒。反转索引列表可以适应我们对显示顺序所做的改变。
我觉得这应该涵盖了所有内容,但如果有人知道这样做会无意中破坏其他功能,请留言告诉我。