- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的模型上有一个 bool 字段,表示某人是否已取消其成员(member)资格。我正在尝试创建一个自定义 SimpleListFilter 来允许过滤此字段。
但是,我真的想只显示那些默认情况下未取消的。有什么办法默认选择“否”选项吗?到目前为止,这是我的过滤器:
class CanceledFilter(SimpleListFilter):
title = 'Canceled'
# Parameter for the filter that will be used in the URL query.
parameter_name = 'canceled'
def lookups(self, request, model_admin):
return (
(True, 'Yes'),
(False, 'No'),
)
def queryset(self, request, queryset):
if self.value() is True or self.value() is None:
return queryset.filter(canceled=True)
if self.value() is False:
return queryset.filter(canceled=False)
编辑:我应该更清楚一点。我专门尝试在管理界面中执行此操作。当我将上述过滤器添加为 admin 中的 list_filter 时。我在管理页面一侧看到一个过滤器,有 3 个选项:全部、是和否。
我希望默认选择“否”或不设置任何选项。相反,默认情况下始终设置“全部”选项。是否有一些简单的方法来设置默认过滤器选择或类似的东西。
基本上在管理员中,当他们查看成员时,我只想默认显示事件的(未取消的)。如果他们点击“全部”或"is",那么我想显示已取消的。
更新:请注意,这与问题 Default filter in Django admin 相同,但我这个问题已经有 6 岁了。接受的答案被标记为需要 Django 1.4。我不确定这个答案是否仍然适用于较新的 Django 版本,或者仍然是最好的答案。
考虑到另一个问题的答案已经过时了,我不确定我们应该如何继续。我认为没有任何方法可以将两者合并。
最佳答案
不得不做同样的事情并偶然发现了你的问题。这就是我在代码中修复它的方法(适应您的示例):
class CanceledFilter(SimpleListFilter):
title = 'Canceled'
# Parameter for the filter that will be used in the URL query.
parameter_name = 'canceled'
def lookups(self, request, model_admin):
return (
(2, 'All'),
(1, 'Yes'),
(0, 'No'),
)
def queryset(self, request, queryset):
if self.value() is None:
self.used_parameters[self.parameter_name] = 0
else:
self.used_parameters[self.parameter_name] = int(self.value())
if self.value() == 2:
return queryset
return queryset.filter(cancelled=self.value())
需要一些解释。查询字符串只是 URL 的一部分,正如其名称所暗示的那样:查询字符串。您的值以字符串形式出现,而不是 bool 值或整数。因此,当您调用 self.value()
时,它会返回一个字符串。
如果您检查单击“是/否”时获得的 URL,在不使用自定义列表过滤器时,您会看到它将其编码为 1/0,而不是 True/False。我采用了相同的方案。
为了完整性和我们 future 的读者,我还为全部添加了 2 个。未经验证,我假设之前是None
。但是,当未选择任何内容时,也会使用 None
,默认为 All。但在我们的例子中,它需要默认为 False,所以我必须选择一个不同的值。如果您不需要 All 选项,只需删除 queryset
方法中的最后一个 if block 以及 lookups
方法中的第一个元组即可。
既然如此,它是如何工作的呢?诀窍在于意识到 self.value()
只是返回:
self.used_parameters.get(self.parameter_name, None)
它可以是一个字符串,也可以是None
,具体取决于该键是否在字典中找到。这就是中心思想:我们确保它包含整数而不是字符串,以便可以在对 queryset.filter()
的调用中使用 self.value()
。对 All 的值进行特殊处理,即 2:在本例中,仅返回 queryset
而不是过滤后的查询集。另一个特殊值是None
,这意味着字典中没有键parameter_name
。在这种情况下,我们创建一个值为 0 的值,以便 False
成为默认值。
注意:你的逻辑不正确;您希望默认情况下不取消,但您将 None
视为与 True
相同。我的版本纠正了这个问题。
ps:是的,您可以检查 'True'
和 'False'
而不是 True
和 False
> 在您的 querystring
方法中,但是您会注意到正确的选择不会突出显示,因为元组中的第一个元素不匹配(然后您将字符串与 bool 值进行比较)。我也尝试制作元组字符串中的第一个元素,但随后我必须进行字符串比较或 eval
才能将 'True'
与 True
,这有点丑陋/不安全。所以最好坚持使用整数,就像我的例子一样。
关于django - 简单列表过滤器默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18603750/
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!