- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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/
假设我有一个像这样的模型: # models.py class Customer(models.Model): customer_name=models.CharField(max_lengt
本质上,我的问题是,无论我过滤什么内容,以下设置都会返回管理页面中的整个查询集。 模型.py from django.db import models class Booking(models.mod
我有代码形式 django docs ,但这会输出错误。 ImportError: cannot import name SimpleListFilter 我使用的是 django 1.3 有人知道这
我正在尝试使一个过滤器的提示发生变化,以响应在另一个过滤器中所做的当前选择。对于如何将 AttributeCategoryFilter 的当前选定值传递给 AttributeFilter,我感到非常迷
我想通过模型中的函数过滤查询集。 class CommentAdmin(admin.ModelAdmin): class PostedByGuestFilter(admin.SimpleLis
假设我们有两个对象: class Author(models.Model): name = models.CharField(length=50) class Book(models.Mode
我在 django 1.4.3 [final] 中有一个管理页面。我们在很多硬件中使用 CF 卡,每张卡都连接到一个 VPN。我有一个函数可以根据卡片最后写入数据库的反馈来确定卡片是否在线。 模型.p
我刚刚为我的 Django 应用程序实现了一个简单的列表过滤器,以仅捕获事件条目,如下所示: class ActiveAircraftsFilter(SimpleListFilter): ti
我写了一个SimpleListFilter,代码如下: http://dpaste.com/639578/ 它在管理列表中正确显示,但我遇到了一个问题,所选选项没有在自定义过滤器中突出显示。只有“全部
我是一名优秀的程序员,十分优秀!