gpt4 book ai didi

python - SimpleListFilter 调用了两次,最后 ?e=1

转载 作者:行者123 更新时间:2023-11-28 17:44:12 24 4
gpt4 key购买 nike

我在 django 1.4.3 [final] 中有一个管理页面。我们在很多硬件中使用 CF 卡,每张卡都连接到一个 VPN。我有一个函数可以根据卡片最后写入数据库的反馈来确定卡片是否在线。

模型.py:

class Card(models.Model):
...
last_feedback = models.DateTimeField(_('Last feedback'), null=True, blank=True)

...
def online_status(self):
nowtime = calendar.timegm(timezone.now().utctimetuple())
seen = calendar.timegm(self.last_feedback.utctimetuple())

diff = nowtime-seen

if (self.state == 1) and (diff < 300):
return '<div style="width:100%%; height:100%%; background-color:green; color:white;">online & production</div>'
elif (diff < 300):
return '<div style="width:100%%; height:100%%; background-color:orange;">online</div>'
else:
return "offline"
online_status.allow_tags = True

管理员.py:

class OnlineFilter(admin.SimpleListFilter):
title = _("Online")
parameter_name = "online"

def lookups(self, request, model_admin):
return (("yes", "Yes"),
("no", "No"),
)

def queryset(self, request, queryset):
out = self.filter(request, queryset)
f = open("/tmp/list", "w")
f.write(str(out))
f.close()
return out

def filter(self, request, queryset):
if not self.value():
return queryset
else:
out = []
if self.value() == 'yes':
for i in queryset:
try:
if i.online_status() != "offline":
out.append(i)
except:
pass
elif self.value() == 'no':
for i in queryset:
try:
if i.online_status() == "offline":
out.append(i)
except:
pass
return out
class CardAdmin(admin.ModelAdmin):
list_filter = [ ... , OnlineFilter ]

每次我尝试设置在线过滤器时,文件 /tmp/list 都会充满正确的卡片集,然后填充默认列表 - 就好像过滤器被调用了两次一样。我浏览器中的 URL 显示的是 ?e=1 而不是 ?online=yes。如果未设置过滤器,则仅调用一次 - 仅在文件中提供一组卡片。

顺便说一句:OnlineFilter.filter 方法不在 queryset 方法中,这样我就知道我的代码出了什么问题,在最终版本中我会把它放上去只有一种方法......

这是一个错误吗?或功能?难道我做错了什么?如果是,是什么?

最佳答案

如果 django 调用 queryset 函数两次我不会感到惊讶 - 我似乎记得以前注意到过一次。不知道为什么。关于为什么过滤器不起作用,django 期望返回一个 QuerySet,而不是一个列表。您也许能够构建一个查询来确定在线状态,但考虑到它的复杂性,我怀疑它会证明超出了 django ORM 的能力,您需要恢复到原始 SQL。另一种方法是创建一个主键列表,简单地按这些键过滤查询集,所以:

def filter(self, request, queryset):
if not self.value():
return queryset
else:
pks = []
if self.value() == 'yes':
for i in queryset:
try:
if i.online_status() != "offline":
pks.append(i.pk)
except:
pass
elif self.value() == 'no':
for i in queryset:
try:
if i.online_status() == "offline":
pks.append(i.pk)
except:
pass
out = queryset.filter(pk__in=pks)
return out

关于python - SimpleListFilter 调用了两次,最后 ?e=1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20497984/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com