【问题标题】:django admin actions on all the filtered objectsdjango 对所有过滤对象的管理操作
【发布时间】:2010-12-30 08:58:24
【问题描述】:

管理员操作可以作用于列表页面中的选定对象。 是否可以对所有过滤的对象进行操作?

例如,如果管理员搜索以“T-shirt”开头的产品名称,结果包含 400 种产品,并且想要将所有产品的价格提高 10%。 如果管理员一次只能修改一个页面的结果,那将需要很多努力。

谢谢

【问题讨论】:

    标签: django search filter admin action


    【解决方案1】:

    这是一个更通用的解决方案,没有经过全面测试(而且它非常幼稚),因此它可能会被奇怪的过滤器破坏。对我来说,可以使用日期过滤器、外键过滤器、布尔过滤器。

    def publish(modeladmin,request,queryset):
        kwargs = {}
        for filter,arg in request.GET.items():
            kwargs.update({filter:arg})
        queryset = queryset.filter(**kwargs)
        queryset.update(published=True)
    

    【讨论】:

      【解决方案2】:

      自定义操作应该用于一组选定的对象,所以我认为没有标准的方式来做你想做的事。

      但我认为我有一个可能对您有用的 hack...(意思是:使用风险自负,并且未经测试)

      在您的操作函数中,request.GET 将包含管理员搜索中使用的 q 参数。因此,如果您在搜索中输入“T 恤”,您应该会看到 request.GET 类似于:

      <QueryDict: {u'q': [u'T-Shirt']}>

      您可以完全忽略自定义操作函数接收的查询字符串参数,并根据 request.GET 的 q 参数构建您自己的查询集。比如:

      def increase_price_10_percent(modeladmin, request, queryset):
          if request.GET['q'] is None:
              # Add some error handling
          queryset=Product.objects.filter(name__contains=request.GET['q'])
          # Your code to increase price in 10%
      increase_price_10_percent.short_description = "Increases price 10% for all products in the search result"
      

      我会确保禁止任何 q 为空的请求。在您阅读name__contains 的地方,您应该模仿您为产品对象的管理员创建的任何过滤器(因此,如果搜索只查看名称字段,name__contains 可能就足够了;如果它查看名称和描述,您在操作函数中也会有一个更复杂的过滤器)。

      我可能还会添加一个中间页面,说明哪些模型会受到影响,并让用户单击“我真的知道我在做什么”确认按钮。查看django.contrib.admin.actions 的代码,了解如何列出正在删除的对象的示例。它应该为您指明正确的方向。

      注意:用户仍然必须在管​​理页面中选择某些内容,否则操作函数将永远不会被调用。

      【讨论】:

        猜你喜欢
        • 2011-05-28
        • 1970-01-01
        • 2014-12-29
        • 2015-04-16
        • 2021-04-23
        • 2015-10-26
        • 2015-10-23
        • 2011-02-23
        • 1970-01-01
        相关资源
        最近更新 更多