如何在 Django 中为(基于类的)通用对象列表创建过滤器表单?

2024-01-05

我正在使用 Django 1.3 的基于类的通用视图来显示图像列表,但我想添加一个过滤器,使用户能够缩小显示结果的范围。

我目前的方法有效,但感觉很黑客:

class ImageFilterForm(ModelForm):
    class Meta:
        model = Image

class ImageListView(ListView):
    model = Image

    def get_queryset(self):
        qs = Image.objects.select_related()  
        for item in self.request.GET:
            key, value = item, self.request.GET.getlist(item)
            # ... Filtering here ...
        return qs

    def get_context_data(self, **kwargs):
        context = super(ImageListView, self).get_context_data(**kwargs)
        context['filter_form'] = ImageFilterForm(self.request.GET)
        return context

是否有更好的方法将自定义过滤添加到通用视图?


我使用相同的方法,但通用,使用 mixin:

class FilterMixin(object):

    def get_queryset_filters(self):
        filters = {}
        for item in self.allowed_filters:
            if item in self.request.GET:
                 filters[self.allowed_filters[item]] = self.request.GET[item]
        return filters

    def get_queryset(self):
        return super(FilterMixin, self).get_queryset()\
              .filter(**self.get_queryset_filters())


class ImageListView(FilterMixin, ListView):

    allowed_filters = {
        'name': 'name',
        'tag': 'tag__name',
    }

    # no need to override get_queryset

这允许指定接受的过滤器列表,并且它们不需要对应于实际的.filter()关键词。然后,您可以扩展它以支持更复杂的过滤(在执行操作时用逗号分隔)__in or __range过滤器是一个简单的例子)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django 中为(基于类的)通用对象列表创建过滤器表单? 的相关文章

随机推荐

  • 如何在 R 中使用 ggplot2 制作默认自定义主题

    当我尝试使用应用定制主题时ggplot2它会收到如下错误 Error in FUN text 1L Theme element text has NULL property family face size hjust vjust angl
  • 图像文件中的二维码解码器(反应本机)

    我正在寻找一种从反应本机 特别是ios 中的图像文件中解码二维码的方法 我知道世博会提供相机扫描仪解决方案 但我需要文件解码器 很感谢任何形式的帮助 您可以使用jsQR 库 https github com cozmo jsQR从图像文件中
  • 将元素与 HTML 表格单元格的底部对齐

    我的 HTML 表格的一个单元格中有多个元素 我希望一些元素与单元格的底部对齐 一些元素与顶部对齐 我无法让元素与底部对齐 我的桌子是 tr td style background color 007CE2 p test br anothe
  • 带有命名空间的 XML 文档上的 XPath

    我有这个带有命名空间的 XML 文档 并且我想使用 XPath 提取一些节点 这是文件
  • Azure 函数在 azure 门户上显示 0 次执行

    我是一个蔚蓝新手 我的设置如下 我有一个 IoT 中心 一个事件中心 一个 Azure 函数 其想法是将消息发送到 IoT 中心 根据某种消息类型将它们路由到事件中心 并使用该函数处理这些事件 我创建了一个示例控制台应用程序 用于将消息从我
  • Ionic 2 范围触摸事件

    我正在尝试在输入末尾使用 Ionic 2 获取范围滑块的值 In the 文档 http ionicframework com docs v2 api components range Range output events唯一可用的事件是
  • ReaderWriterLockSlim 什么时候比简单的锁更好?

    我正在使用这段代码对 ReaderWriterLock 进行一个非常愚蠢的基准测试 其中读取的频率比写入的频率高 4 倍 class Program static void Main ISynchro test new Locked new
  • 类名中有一个“+”?

    班级名称 MyAssembly MyClass MyOtherClass 问题显然是 作为分隔符 而不是传统的点 它的作用 并查找官方文档 看看其他分隔符是否存在 这就是嵌套类型的表示方式 例如 namespace Foo class Ou
  • ASP.NET API 无法在 Azure 上发布

    我正在尝试将 C API 发布到 azure 我遵循了中的所有步骤本文档 https learn microsoft com en us aspnet core tutorials publish to azure api manageme
  • 对于接近统一的值,浮点数学是否更精确?

    Question 我多次被告知 如果运算的数字接近于浮点运算 则浮点运算具有最高的精度 1 0 或者有时0 1 有没有道理呢 澄清 我所说的 算术 是指诸如a b a b a b 但是也sqrt x 和其他数学函数 具体来说 假设所有变量都
  • Python 中的 CRC16

    如何在Python中计算CRC16 在 Perl 中我会写这样的东西 use Digest CRC crc16 result crc16 str 我如何在Python中做同样的事情 这里有一个计算CRC16的库http pypi pytho
  • 如何检查数组的所有元素是否相同?

    即 验证 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 but not a 0 1 a 0 2 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 a 0 1 谢谢 count ar
  • 如何将字节值转换为小数?

    我正在尝试从文件中加载一些十进制值 但我无法找出获取原始值并将其转换为小数的正确方法 我已将文件读入字节数组 每个四个字节块应该代表一个十进制值 为了帮助解决这个问题 我构建了一个表格 其中说明十进制值 1 到 46 如何表示为四个字节块
  • Visual Studio 调试器跳过断点

    在调试单元测试时 我的 Visual Studio 2008 IDE 的行为非常奇怪 我有一个断点 当我点击它并尝试使用 F10 单步执行时 测试就会结束 如果我在被测试方法内的每一行上设置断点 我最终会得到一个随机断点 而不是下一行的下一
  • 切割频谱图 matplotlib 中未使用的频率

    我有一个采样率为 16e3 的信号 其频率范围为 125 到 1000 Hz 因此 如果我绘制一个频谱图 由于所有未使用的频率 我会得到一个非常小的颜色范围 我尝试通过设置 x 限制来修复它 但这不起作用 有没有办法切断未使用的频率或用 N
  • 达到虚拟实时时间限制(178/120秒)

    我使用的是ubuntu 16版本并运行Odoo erp系统12 0版本 在我的应用程序日志文件中 我看到信息显示 已达到虚拟实时时间限制 178 120 秒 它到底意味着什么以及它会对我的应用程序造成什么损害 另外我如何增加虚拟实时限制 它
  • 无法加载本机 TensorFlow 运行时。原因:未找到图像。我究竟做错了什么?

    在配备四核 I7 和 NVIDIA GeForce GT 650M 的 Macbook Pro 上运行 从 virtualenv 运行 Tensorflow 时收到此错误消息 我做错了什么 我使用的是 protobuf 版本 3 2 0 t
  • 在没有 BindingSource 的情况下使用 BindingNavigator

    我有一个在数据库中完成分页的应用程序 也就是说 检索项目列表的调用包括页码 页面大小 并且将仅返回该页面的数据 例如 ItemCollection items ListAllItems 1 20 page 1 show 20 items p
  • Visual Studio 2010 RC 中的 IntelliSense 冻结

    每次我尝试编写一些内容时 IntelliSense 都会冻结 Visual Studio 我必须等待大约 2 分钟才能显示代码完成列表 我能使用的唯一方法就是完全关闭它 我已经安装了 Microsoft 的最后一个 IntelliSense
  • 如何在 Django 中为(基于类的)通用对象列表创建过滤器表单?

    我正在使用 Django 1 3 的基于类的通用视图来显示图像列表 但我想添加一个过滤器 使用户能够缩小显示结果的范围 我目前的方法有效 但感觉很黑客 class ImageFilterForm ModelForm class Meta m