2009-12-28 180 views
2

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

例如,如果管理员搜索以“T恤”,这跟400级的产品结果开始,并希望通过提高10%,所有这些价格的产品名称。 如果管理员一次只能修改一页结果,则需要付出很大的努力。

感谢

回答

2

的自定义操作都应该是对一组选定对象的使用,所以我不认为这是做你想要什么的标准方法。

但是我想我有可能为你工作一劈...(意思是:您自担风险使用,它是未经测试)

在你动功能的request.GET将包含在使用Q参数管理员搜索。所以,如果你在搜索中键入“T恤”,你应该看到request.GET看起来类似:

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

你可以完全不顾你的自定义操作函数接收查询参数并建立自己的查询集基于request.GET'sq参数。就像:

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的代码,查看如何列出要删除的对象的示例。它应该指向正确的方向。

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

2

这是一个更通用的解决方案,没有经过全面测试(和其漂亮的幼稚),所以它可能会用异样的过滤器破裂。对于我来说,可以使用日期过滤器,外键过滤器,布尔过滤器。

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)