Django管理员通过get_list_filter过滤远程字段

时间:2015-06-03 08:41:37

标签: django django-models django-admin

我有3个模型,由FKs链接在这样的链中:

class Customer(models.Model):
    name = models.CharField(max_length=100)


class Order(models.Model):
    name = models.CharField(max_length=100)
    customer = models.ForeignKey(
        'customer.Customer', on_delete=models.PROTECT)


class Task(models.Model):
    name = models.CharField(max_length=100)
    order = models.ForeignKey(
        'order.Order', on_delete=models.PROTECT)

现在,如果在我的TaskAdmin中,我使用:

list_filter = ('order__customer', )

一切正常。但如果我选择:

def get_list_filter(self, request):
    return ('order__customer', )

页面加载,但只要我点击任何可能的客户,就会出现错误请求(400)错误页面。这对我来说听起来像是一个Django错误,但也许我在这里做错了什么......有什么提示吗?

1 个答案:

答案 0 :(得分:2)

我没有足够的声誉来添加评论,所以我会写在这里,即使这不是真正的答案。

看来这个主题是一个开放的票:lookup_allowed fails to consider dynamic list_filter

您可以使用两种不同的解决方法来快速解决此问题,直到它将在上游修复:

  • get_list_filter之外,您还可以定义list_filter = ('order__customer',),以便此字段的查找始终列入白名单,即使未使用(因为get_list_filter优先)
  • 您可以这样覆盖lookup_allowed

    def lookup_allowed(self, lookup, *args, **kwargs):
        if lookup == 'order__customer__id__exact':
            return True
        return super(TaskAdmin, self).lookup_allowed(lookup, *args, **kwargs)
    

    这明确允许单个查找将用作url param。